私は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はループが唯一満たしつつ2
回if
で4782.
条件となるまでしかし、ループが
>=0
..<=0
または3
回if
有効にする必要があります。
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
@squeamishossifrageのおかげで、それでもコードを編集した後、それはまだいないようです999が限界変数に正しく格納されています。 – Rahul
GMPはインプレース追加( 'mpz_add(a、a、b)')を行うことができるので、2つの値だけが必要です。たとえば、 'i = 1 - i'を使用して2つの間を切り替えたり、' i'を完全に取り除いて 'cnt%2'や' cnt&1'を使うことができます。 ( 'cnt'には、少しの効率向上の可能性がありますが、目立つことはありません。) – rici