2016-02-04 56 views
0

我想打印Fibonacci序列中名为“fibonacci.txt”多达200项,但执行后的文件包含了一些错误的款项文件,Fibonacci序列出了错

一些款项均低于预期

  • 我检查了,它不是任何错误的数据类型,我用的无符号长,所以应该不会有任何问题。
  • 我正在使用Cfree 5.0。

我附上代码和输出的问题。

int main(){ 
ofstream text_file; 
text_file.open("fibonnacci.txt"); 

unsigned long sum, sum1=1, sum2=1; 

text_file<<sum1<<"\t"<<sum2<<"\t"; 
for(int i = 1; i < 200; i++) { 
    sum = sum1 + sum2; 
    text_file<<sum<<"\n"; 
    /*if(i%5 == 0){ 
     text_file<<"\n"; 
    }*/ 
    sum2 = sum1; 
    sum1 = sum; 

} 
text_file<<"\n"; 

return 0; 
} 

输出

102334155 
165580141 
267914296 
433494437 
701408733 
1134903170 
1836311903 
2971215073 
512559680 
3483774753 
3996334433 
3185141890 
2886509027 
1776683621 
368225352 
2144908973 
2513134325 
363076002 
2876210327 
3239286329 
1820529360 
764848393 
2585377753 
3350226146 

这些都是一些术语中旬。很明显,我们可以通过计算位数来看到某些术语比以前的术语少。

+1

您需要详细了解[整数类型](http://en.cppreference.com/w/cpp/language/types#Integer_types)并检查[他们的范围](http://en.cppreference.com/w/cpp/language/types#Range_of_values)。 –

+0

我知道无符号长数据类型有大约40亿的高范围,所以不应该有任何问题。 –

+2

如果你有18亿和增加29亿,结果会是什么? *超过*无符号32位整数约40亿的限制。这就是您在添加时遇到的问题,例如'1836311903'和'2971215073'并获得'512559680'。 –

回答

2

您的sum变量中有一个溢出。 unsigned long的最大数量为4294967295.尝试使用__int64作为示例

+0

...这也不会让你更进一步。对于200项来说,double应该是OK。 – gnasher729

+0

@ gnasher729双工。谢谢......我认为没有符号的long就足够了。但是双倍给出了十的权力答案,四舍五入的数字我不能得到精确的数字? –

+0

谢谢@ bazz-dee的帮助.. –