Я пытаюсь вычислить индекс числа Фибоначчи с 1000 цифрами.Каков правильный способ использования целочисленных функций GMP в программах на C?
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 до 1-го и последнего элемента. Я знаю, потому что эти элементы не меняются. Но цикл должен быть действительным до CNT становится 4782.
состояние, в то время как цикл выполняется только
2
разif
..<=0
или3
разif
..>=0
.
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. Integer Functions
@squeamishossifrage Спасибо за предложение, но даже после редактирования кода, это все еще не кажется чтобы дать ответ.10^999 правильно хранится в предельной переменной. – Rahul
GMP может выполнять добавление на месте ('mpz_add (a, a, b)'), поэтому вам нужны только два значения. Вы можете использовать, например, «i = 1 - i» для переключения между ними, или вы можете полностью избавиться от «i» и использовать 'cnt% 2', или' cnt & 1'. (Сделайте 'cnt' неподписанным для возможного небольшого повышения эффективности, а не то, что он будет заметным.) – rici