我正在尝试生成斐波纳契数,我将它们存储为无符号长long。但是,如果系列中的新数字大于unsigned long long可以容纳的数字,我希望停止生成更多数字。我目前有以下内容。
unsigned long long n1 = 1, n2 = 1, n3;
int i;
for(i = 0; i < n; i++) {
if(i == 0 || i == 1) {
fprintf(fibonacci_file, "%lld\n", n1);
}else {
n3 = n1 + n2;
if(n3 < n1) {
printf("FIBONACCI OVERFLOW\n");
break;
}else {
fprintf(fibonacci_file, "%lld\n", n3);
n1 = n2;
n2 = n3;
}
}
}
然后输出文件的结尾如下所示。
1100087778366101931
1779979416004714189
2880067194370816120
4660046610375530309
7540113804746346429
-6246583658587674878
最后一个是否定的,意味着结果溢出。但是我的检查应该抓住它而不打印出来,然后结束循环。
答案 0 :(得分:2)
用于打印全范围unsigned long long
的错误说明符。使用"%llu"
。 @void_ptr
unsigned long long n3;
....
// fprintf(fibonacci_file, "%lld\n", n3);
fprintf(fibonacci_file, "%llu\n", n3);
OP的检测溢出的方法很好,如C中所示,数学溢出很好地定义为简单的&#34; wrap&#34;。这是伪代码:unsigned_sum = math_sum mod (UMAX+1)
给出所涉及类型的最大值。
if (n3 < n1) {
printf("FIBONACCI OVERFLOW\n");
break;
删除的讨论还提出了一个惯用的测试@Weather Vane和@Olaf也可以。当涉及的类型不是无符号整数,而是有符号整数或浮点时,此方法很有用。
if (ULLONG_MAX - n2 < n1) {
printf("FIBONACCI OVERFLOW\n");
break;
}
n3 = n1 + n2;
此外,该系列有时被视为从F[0] = 0
开始。见Fibonacci number