这是我的代码 int j
:
void solve(){
unsigned long long n;
cin>>n;
unsigned long long sum = 0;
int j = 1;
for(int i=3;i<n+1;i+=2){
sum += ((4*i)-4)*(j);
j++;
}
cout<<sum<<"\n";
}
Input:
499993
Output:
6229295798864
但它给出了错误的输出,这是我的代码,其中有 long long j
工作正常。
void solve(){
int n;
cin>>n;
unsigned long long sum = 0;
long long j = 1;
for(int i=3;i<n+1;i+=2){
sum += ((4*i)-4)*(j);
j++;
}
cout<<sum<<"\n";
}
Input:
499993
Output:
41664916690999888
在这种情况下 j
远低于 499993
,它是在 int
范围,但还是不行。其实为什么会出现这种情况呢?
这里是实际的链接 问题. 万一,你想看看。
请注意 ((4*i)-4)*(j)
是一个int,因为两个 i
和 j
是int类型。只有在添加了 ((4*i)-4)*(j)
到 sum
. 但这一表述 ((4*i)-4)*(j)
已经超出了int类型的大小,对于一个足够大的 n
晋升前。
但是,如果你改变了其中一个 i
或 j
到unsigned long long,表达式 ((4*i)-4)*(j)
被评估为unsigned long long,安全地在大小限制内。
在表达式中的第一段代码中,我们可以看到
((4*i)-4)*(j)
转让声明的内容
sum += ((4*i)-4)*(j);
两个操作数 (4*i)-4)
和 (j)
有型 int
. 所以表达式的类型(操作数的通用类型)也是 int
. 但是,这种类型的对象 int
不够大,无法存储结果值。所以这里发生了溢出。
当 j
被声明为具有 long long
long long j = 1;
那么上述表达式的常见类型也是 long long
. 这意味着,由于通常的算术转换,这个操作数 (4*i)-4)
也被转换为 long long
. 这种类型的对象可以存储为输入数据提供的结果值。
你可以检查什么是最大的值,可以存储在对象的类型的 int
和 long long
.
给你
#include <iostream>
#include <limits>
int main()
{
std::cout << "The maximum value of an object of the type int is "
<< std::numeric_limits<int>::max()
<< '\n';
std::cout << "The maximum value of an object of the type long long is "
<< std::numeric_limits<long long>::max()
<< '\n';
return 0;
}
程序的输出可能是这样的
The maximum value of an object of the type int is 2147483647
The maximum value of an object of the type long long is 9223372036854775807