我有一个程序,假设找到斐波那契序列中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位数。现在我不知道该怎么做
答案 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 long
或unsigned 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 long
或unsigned long long
,包括返回类型fibNum
。这样可以轻松覆盖18位数字。