这是我的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
范围内,但仍然无法正常工作。为什么会这样呢?这是实际problem的链接。万一你想看看。
最佳答案
注意((4*i)-4)*(j)
的结果是一个int,因为i
和j
都是int类型。仅当将((4*i)-4)*(j)
添加到sum
时,右侧才会提升为unsigned long long。但是表达式((4*i)-4)*(j)
在提升之前已经溢出了足够大的n
的int类型的大小。
但是,如果将i
或j
中的任何一个更改为unsigned long long,表达式((4*i)-4)*(j)
的值将被评估为unsigned long long,并且安全地在大小限制内。
关于c++ - 为什么 “int”无法与 “j”一起正常工作,但是long long可以正常工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61817328/