2016-10-31 8 views
0

私は1000桁のフィボナッチ数のインデックスを計算しようとしています。CプログラムでGMP整数関数を使用する正しい方法は何ですか?

int i = 0, cnt = 2; 

mpz_t limit; 
mpz_init (limit); 
mpz_ui_pow_ui(limit,10UL,999UL); 

mpz_t fib[3]; 

for (i = 0; i < 3; i++) 
    mpz_init2(fib[i], 1024UL); 

mpz_set_ui(fib[0],1UL); 
mpz_set_ui(fib[2],1UL);      

私が第一と最後の要素に1を割り当てると間違って何かがあると思います。私はこれらの要素が変化していないので、それを知っています。 CNTはループが唯一満たしつつ2ifで4782.

条件となるまでしかし、ループが>=0 .. <=0または3if有効にする必要があります。

while(mpz_cmp(fib[i],limit)<=0) // should be <= only, not >= 
    { 
    i=(i+1)%3; 
    cnt++; 
    mpz_add(fib[i],fib[(i+1)%3],fib[(i+2)%3]); 
    } 

for (i = 0; i < 3; i++) 
    mpz_clear(fib[i]); 

mpz_clear(limit); 

printf("Fibonacci number with more than 1000 digits: %d\n",cnt); 

(それが完全にコンパイルされた)、この内の論理エラーを見つけるのに役立つしてください。

P.S.私は内蔵のmpz_fib_uiを使いたくない。ループのための、I = 3後 Integer Functions

+0

@squeamishossifrageのおかげで、それでもコードを編集した後、それはまだいないようです999が限界変数に正しく格納されています。 – Rahul

+0

GMPはインプレース追加( 'mpz_add(a、a、b)')を行うことができるので、2つの値だけが必要です。たとえば、 'i = 1 - i'を使用して2つの間を切り替えたり、' i'を完全に取り除いて 'cnt%2'や' cnt&1'を使うことができます。 ( 'cnt'には、少しの効率向上の可能性がありますが、目立つことはありません。) – rici

答えて

1

、whileループの条件文がFIBに依存するので、[3]

は、I = 0を追加します。 whileループは、それを修正し、私に必要な出力できます前に:1000の以上の数字で

のフィボナッチ数を:それを示唆ための4782の

+0

ありがとう、それは私の愚かなことです。次回からは、各変数の値に注目していきます。 – Rahul

関連する問題