2016-10-31 7 views
0

Я пытаюсь вычислить индекс числа Фибоначчи с 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

+0

@squeamishossifrage Спасибо за предложение, но даже после редактирования кода, это все еще не кажется чтобы дать ответ.10^999 правильно хранится в предельной переменной. – Rahul

+0

GMP может выполнять добавление на месте ('mpz_add (a, a, b)'), поэтому вам нужны только два значения. Вы можете использовать, например, «i = 1 - i» для переключения между ними, или вы можете полностью избавиться от «i» и использовать 'cnt% 2', или' cnt & 1'. (Сделайте 'cnt' неподписанным для возможного небольшого повышения эффективности, а не то, что он будет заметным.) – rici

ответ

1

После того, как цикл, я = 3, так что условный оператор для время цикла зависит от FIB [3]

Добавление I = 0; до того, как петля, а фиксирует его, и дает мне желаемый результат:

число Фибоначчи с более чем 1000 цифр: 4782

+0

Спасибо, это так глупо. В следующий раз я буду следить за значением каждой переменной. – Rahul