我用c ++编写了一个程序来输出你告诉它的fibonacci序列中的数字。它一直工作到大约第47个数字,然后它打印出完全不同的数字,甚至是负数,并且它们都没有超过9或10个单独的整数。这是代码
#include <iostream>
int a = 0;
int b = 1;
int c;
int var = 0;
int num;
void fibonacci()
{
using namespace std;
c = a;
a = a + b;
b = c;
var += 1;
}
void loop()
{
using namespace std;
for (int iii=0; iii<num; iii++)
fibonacci();
}
int main()
{
using namespace std;
cout << "What fibonacci number do you want to know? ";
cin >> num;
cin.get();
loop();
cout << "" << endl;
cout << c << endl;
cin.get();
a = 0;
b = 1;
var = 0;
return main();
}
c ++可以一次打印多少个字符会有某种限制吗?
答案 0 :(得分:6)
Fib(47) = 2971215073
大于2147483647
。
std::numeric_limits<int>::max() == 2^31 - 1 == 2147483647
。
结果整数因此溢出num == 47
。
@jogojapan补充道:
sizeof(int)是4个字节(在许多平台上,即),是32位。 2 ^ 31-1 [numeric_limits :: max()]是使用int(on。)可以呈现的最大数字 那些平台)。
答案 1 :(得分:1)
将您的数据类型大小/容量从int
增加到unsigned long
或unsigned long long
。这些中的每一个都具有一个大小,当超过该大小时,会产生一个位模式,这将产生几乎肯定不正确的值。此外,由于您的号码永远不会是负数,因此允许将数字大小的一部分用于负值(这有点)会浪费您可以表示的最大数量。
此外,您应该添加一个检查以检测此案例。如果此算法中的值有所下降,则您明显超出了数据类型的限制。此时,打印一个礼貌错误,您无法计算该数字,因为它太大了。
答案 2 :(得分:1)
这是我用C:
输出Fabonica系列的代码 #include<stdio.h>
int main(){
int k,r;
long int i=0l,j=1,f;
//Taking maximum numbers form user
printf("Enter the number range:");
scanf("%d",&r);
printf("FIBONACCI SERIES: ");
printf("%ld %ld",i,j); //printing firts two values.
for(k=2;k<r;k++){
f=i+j;
i=j;
j=f;
printf(" %ld",j);
}
return 0;
}
示例输出:
输入数字范围:15
FIBONACCI系列:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
使用c
中的数组的斐波那契数列 #include<stdio.h>
int main(){
int i,range;
long int arr[40];
printf("Enter the number range: ");
scanf("%d",&range);
arr[0]=0;
arr[1]=1;
for(i=2;i<range;i++){
arr[i] = arr[i-1] + arr[i-2];
}
printf("Fibonacci series is: ");
for(i=0;i<range;i++)
printf("%ld ",arr[i]);
return 0;
}
答案 3 :(得分:0)
你的整数溢出。 Google“整数溢出”和已签名的int的容量。尝试将其更改为unsigned int,您会发现它会以更高的数字溢出。
答案 4 :(得分:-1)
这不是因为cout可以处理的位数限制。这是因为你的数字很大,以适应int
。尝试对long
,long long
和a
使用b
或c
。 Here是对不同数据类型的一个很好的参考。