【问题标题】:cout doesn't output the correct datacout 没有输出正确的数据
【发布时间】:2012-09-16 14:52:26
【问题描述】:

我用 C++ 编写了一个程序来输出你告诉它的斐波那契数列中的数字。它一直工作到大约第 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++ 一次可以打印多少个字符是否有某种限制?

【问题讨论】:

  • 你需要多少个字符?您可以只使用longlong long。类型在 C++ 中有限制(如果不是所有其他语言,大多数也是如此)。
  • 什么数据类型可以获得最大字符数?
  • 我想弄清楚为什么你在甚至不使用命名空间的函数中有using namespace std;
  • std::cout &lt;&lt; std::numerical_limits&lt;int&gt;::max() &lt;&lt; "\n";
  • @WillumMaguire,GMP 之类的东西可以让您随心所欲。除此之外,uint64_t 应该是无符号的 64 位类型,我认为 Visual Studio 甚至有一个特定于编译器的 128 位类型。

标签: c++ integer cout fibonacci


【解决方案1】:

Fib(47) = 2971215073 大于2147483647

std::numeric_limits&lt;int&gt;::max() == 2^31 - 1 == 2147483647 在你的情况下。

因此,您的结果整数会在 num == 47 处溢出。

@jogojapan 添加:

sizeof(int) 是 4 字节(在许多平台上),即 32 位。 2^31-1 [numeric_limits::max()] 是可以使用 int (on 那些平台)。

【讨论】:

  • 答案提供了丰富的信息,虽然 int 已签名是错误的,因此最大值将是 2^31-1
  • @DavidRodríguez-dribeas 非常感谢。我有点着急。
  • sizeof(int) 是 4 字节(在许多平台上,即),即 32 位。 2^31-1 是可以使用 int 呈现的最大数字(在这些平台上)。
  • @iccthedral 当然,没关系;我发表评论主要是因为您有sizeof(int)==2^31-1,这似乎将sizeof(int) 与MAX_INT 混淆了。当然我们都知道你的意思,但仍然。
  • 很好地使用了std::numeric_limits&lt;&gt;,它可以在运行时用来检测你离限制有多近。
【解决方案2】:

将您的数据类型大小/容量从int 增加到unsigned longunsigned long long。这些中的每一个都有一个大小,当超过时,会创建一个位模式,这将创建一个几乎肯定不正确的值。此外,由于您的数字永远不会是负数,因此允许将数字的部分大小用于负值(有点)浪费了您可以表示的最大数字。

此外,您应该添加一个检查来检测这种情况。如果该算法中的某个值下降,则您显然超出了数据类型的限制。此时,打印一个礼貌错误,您无法计算该数字,因为它太大了。

【讨论】:

    【解决方案3】:

    你的整数溢出了。谷歌“整数溢出”和一个有符号整数的容量。尝试将其更改为 unsigned int,您会发现它会以更大的数字溢出。

    【讨论】:

      【解决方案4】:

      这是我用 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

      斐波那契系列: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;
      }
      

      【讨论】:

        【解决方案5】:

        这不是因为 cout 可以处理的位数有限制。这是因为您的数字太大而无法容纳int。尝试将longlong long 用于abcHere 是不同数据类型的一个很好的参考。

        【讨论】:

        • long 通常是 int 的同义词。
        • 是的,但它并不总是相同的,OP 没有提到编译器和架构的细节。看到这个:stackoverflow.com/a/589684/812269
        • 使用无符号整数也应该有助于扩展范围。
        • 我尝试将 int a、int b 等改为 long a、long b 等,但仍然在 48 处溢出
        • 那么你的 long 和 int 可能是一样的。尝试将它们声明为unsigned long long
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多