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는 루프 if .. <=0 또는 3if .. >=02 회만 만족 동안 4782.

조건해진다까지 그러나 루프 유효해야한다.

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. 내장 된 mpz_fib_ui를 사용하고 싶지 않습니다. 루프 애프터 Integer Functions

+0

@squeamishossifrage 감사하지만, 심지어 코드를 편집 한 후, 아직 보이지 않는다 999가 한계 변수에 올바르게 저장되었습니다. – Rahul

+0

GMP는 in-place 추가 ('mpz_add (a, a, b)')를 할 수 있으므로 두 값만 있으면됩니다. 예를 들어,'i = 1 - i'를 사용하여이 둘 사이를 토글하거나'i'를 모두 없애고'cnt % 2' 또는'cnt & 1'을 사용할 수 있습니다. ('cnt'가 가능한 약간의 효율성 향상을 위해 서명되지 않도록하십시오. 눈에 띄지 않을 것입니다.) – rici

답변

1

는, I = 3이므로 while 루프위한 조건문이 FIB에 따라 [3]

추가 I = 0; while 루프가를 해결하고, 나에게 원하는 출력 제공하기 전에 : 1000 개 이상의 자리

피보나치 번호 : 그 제안에 대한 4782 개

+0

고마워, 그게 내 바보 야. 다음 번부터는 각 변수의 가치를 계속 지켜 볼 것입니다. – Rahul