在 C 程序中使用 GMP 整数函数的正确方法是什么?
What is the correct way of using GMP integer functions in C programs?
我正在尝试计算具有 1000 位数字的斐波那契数的索引。
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 变为 4782.
The condition in while loop is only satisfied 2
times if
.. <=0
or 3
times 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
for循环后,i=3,所以while循环的条件语句依赖于fib[3]
添加i=0;在 while 循环修复它之前,给了我想要的输出:
1000 位以上的斐波那契数:4782
我正在尝试计算具有 1000 位数字的斐波那契数的索引。
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 变为 4782.
The condition in while loop is only satisfied
2
timesif
..<=0
or3
timesif
..>=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
for循环后,i=3,所以while循环的条件语句依赖于fib[3]
添加i=0;在 while 循环修复它之前,给了我想要的输出:
1000 位以上的斐波那契数:4782