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
또는 3
회 if
.. >=0
2
회만 만족 동안 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
@squeamishossifrage 감사하지만, 심지어 코드를 편집 한 후, 아직 보이지 않는다 999가 한계 변수에 올바르게 저장되었습니다. – Rahul
GMP는 in-place 추가 ('mpz_add (a, a, b)')를 할 수 있으므로 두 값만 있으면됩니다. 예를 들어,'i = 1 - i'를 사용하여이 둘 사이를 토글하거나'i'를 모두 없애고'cnt % 2' 또는'cnt & 1'을 사용할 수 있습니다. ('cnt'가 가능한 약간의 효율성 향상을 위해 서명되지 않도록하십시오. 눈에 띄지 않을 것입니다.) – rici