cout不输出正确的数据

时间:2012-09-16 14:52:26

标签: c++ integer cout fibonacci

我用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 ++可以一次打印多少个字符会有某种限制吗?

5 个答案:

答案 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 longunsigned 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。尝试对longlong longa使用bcHere是对不同数据类型的一个很好的参考。