输出一个15位数字

时间:2014-02-25 21:25:34

标签: c++ fibonacci

我有一个程序,假设找到斐波那契序列中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;

我发现问题与数组有关。该数组不能存储第10个数字,即10位数。现在我不知道该怎么做

3 个答案:

答案 0 :(得分:1)

类型long long保证至少为64位(在我看到的每个实现上都是64位)。它的最大值LLONG_MAX至少为2 63 -1,或9223372036854775807,即19位十进制数字 - 因此long long大于代表15位数字。

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

你也可以使用unsigned long long,其上限至少为2 64 -1,但long longunsigned long long应该足够宽为了你的目的。

在C ++中显示long long值非常简单:

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

如果您因某些原因而偏好printf,请使用"%lld"的{​​{1}}格式,long long "%llu"

(对于宽度太大而不适合64位的整数,有一些处理任意大整数的软件包;最突出的是GNU的GMP。但你不需要15位整数。)< / p>

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

  

该数组无法存储第10个数字的第47个术语。

这表明您的体系结构具有long类型,只有32位。这对于32位架构来说很常见。 32位涵盖9位数字和低10位数字,对于long,精确到2.147.483.647,对于unsigned long,精确到4.294.967.295。

只需将您的long类型更改为long longunsigned long long,包括返回类型fibNum。这样可以轻松覆盖18位数字。

相关问题