【问题标题】:Output a 15 digit number输出一个 15 位数字
【发布时间】:2014-03-28 09:44:44
【问题描述】:

我有一个程序,假设在斐波那契数列中找到 1 到 75 之间所有可被 3 整除的数字的总和,并将它们加在一起。我让程序正常工作,我遇到的唯一问题是能够显示这么大的数字。有人告诉我答案应该是 15 位数字。我尝试过 long long、long double、unsigned long long int,但这些都没有产生正确的输出(它们产生负数)。

代码:

 long fibNum(int kth, int nth);

int main()
{
    int kTerm;
    int nTerm;

    kTerm = 76;
    nTerm = 3;

    std::cout << fibNum(kTerm, nTerm) << std::endl;

    system("pause");
    return 0;
}

long fibNum(int kth, int nth)
{
    int term[100];
    long firstTerm;
    long secondTerm;
    long exactValue;

    int i;

    term[1] = 1;
    term[2] = 1;
    exactValue = 0;

    do
    {
        firstTerm = term[nth - 1];
        secondTerm = term[nth - 2];
        term[nth] = (firstTerm + secondTerm);

        nth++;
    }
    while(nth < kth);

    for(i = 1; i < kth; i++)
    {
        if(term[i] % 3 == 0)
        {
            term[i] = term[i];
        }
        else
            term[i] = 0;

        exactValue = term[i] + exactValue;
    }

    return exactValue;

我发现问题与数组有关。该数组不能存储第 47 项,即 10 位数。现在我不知道该怎么办了

【问题讨论】:

  • 如果没有按原样编译的东西很难说,但是looks like a 15-digit number to me
  • @chris:哎呀!我读的是阶乘,而不是斐波那契。
  • 尝试将termfirstTermsecondTermexactValue 声明为double。关于输出,这取决于你用什么来输出东西。但是,here 是您操作 iostream 的方式,here 是它对 printf 的操作方式。
  • 附带说明,我不知道为什么除了secondTerm 之外的所有内容都是long long
  • 您没有包含任何试图“显示”或“输出”任何内容的代码,这是您提出的问题(“输出 15 位数字”和“如果我不能显示整个数字如何以科学计数法显示?”)。如果您没有向我们展示您是如何尝试显示或输出它的,那么很难说它为什么不起作用。

标签: c++ fibonacci


【解决方案1】:

数组不能存储第 47 项,即 10 位。

这表明您的架构有一个只有 32 位的类型 long。这对于 32 位架构很常见。 32 位涵盖 9 位数字和低 10 位数字,准确地说是 long 为 2.147.483.647,unsigned long 为 4.294.967.295。

只需将long 类型更改为long longunsigned long long,包括fibNum 的返回类型。这很容易涵盖 18 位数字。

【讨论】:

    【解决方案2】:

    你可以采取char s[15]int i=14,k, 然后进行while循环直到sum!=0 在while体下

    k=n%10;
    s[i]=k+48;
    n=n/10;
    i--;
    

    【讨论】:

    • 你为什么只是暗示从整数到 ASCII 的转换,为什么不在这里解决真正的问题?
    • 真正的问题是获得非常大的输出。所以我确实使用了字符串并通过它的 ASCII 值扫描每个整数。只需阅读所提出的问题。
    【解决方案3】:

    类型 long long 保证至少为 64 位(并且在我见过的每个实现中都是 64 位)。它的最大值LLONG_MAX 至少为 263-1,或 9223372036854775807,即 19 位十进制数字——所以 long long 足以表示 15 位数字。

    始终使用long long 类型。在您的代码中,您有一个 long double 类型的变量,其范围远大于 long long,但精度可能较低(这可能无法确定给定数字是否为 3 的倍数。)

    您也可以使用 unsigned long long,其上限至少为 264-1,但 long longunsigned long long 的宽度应该足以满足您的目的。

    在 C++ 中显示 long long 值很简单:

    long long num = some_value;
    std::cout << "num = " << num << "\n";
    

    或者,如果您出于某种原因更喜欢printf,请使用"%lld" 格式来表示long long"%llu" 表示unsigned long long

    (对于太宽而无法放入 64 位的整数,有一些软件包可以处理任意大的整数;最突出的是 GNU 的 GMP。但对于 15 位整数,您不需要它。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2013-03-04
      • 1970-01-01
      • 2013-09-24
      相关资源
      最近更新 更多