【发布时间】:2016-02-17 10:35:14
【问题描述】:
我正在尝试编写将打印前 100 万个斐波那契数的 C 代码。
实际的问题是我想得到F(1,000,000)的最后10位
我了解序列的工作原理以及如何编写代码来实现这一点,但是由于 F(1,000,000) 非常大,我正在努力寻找一种表示它的方法。
这是我正在使用的代码:
#include<stdio.h>
int main()
{
unsigned long long n, first = 0, second = 1, next, c;
printf("Enter the number of terms\n");
scanf("%d",&n);
printf("First %d terms of Fibonacci series are :-\n",n);
for ( c = 0 ; c < n ; c++ )
{
if ( c <= 1 )
next = c;
else
{
next = first + second;
first = second;
second = next;
}
printf("%d\n",next);
}
return 0;
}
我正在使用long long 尝试确保有足够的位来存储数字。
这是第一个 100 数字的输出:
First 100 terms of Fibonacci series are :-
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
-1323752223
512559680
-811192543
-298632863
-1109825406
-1408458269
...
截断了输出,但你可以看到问题,我相信生成的数字的大小导致值溢出为负数。老实说,我不明白如何阻止它。
谁能指出我如何实际处理这种大小的数字的正确方向?
我没有尝试打印第一个百万,因为如果它在打印 F(100) 时失败,那么它打印 F(1,000,000) 的希望不大。
【问题讨论】:
-
长长的还不够!
-
一个
long long至少应该高于1836311903 -
@BasileStarynkevitch 我认为你过于苛刻了。初学者可能没有足够的模运算经验来意识到整个计算可以在 10^10 模下进行。对程序员来说显而易见的事情对学生来说并不总是显而易见的。
-
使用
%lld格式说明符而不是%d,但这只会让您更进一步。但无论如何,下面的答案非常全面。