我正在解决 spoj 上的问题,SPOJ CARDS 问题很简单,我得到了小数字的正确输出,但由于整数溢出,spoj 似乎不接受, 那么我应该使用什么整数类型?
或者是否还有其他问题他们不接受?我也不知道可能失败的测试用例
其他人似乎使用相同逻辑的一些已接受的解决方案,并且该解决方案已被接受accepted sol
测试用例:
2
3
7
输出:
15
77
.
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
unsigned long long int sum1=0;
unsigned long long int sum2=0;
sum1=((n*(n-1))/2)%1000007;
// cout<<"sum1 is"<<sum1;
sum2=(n*n+n)%1000007;
cout<<(sum1+sum2)%1000007<<endl;
}
}
编辑
当我使用 unsigned long long n 但 n 的最大值是时,答案得到接受 1000 000 那么它也应该在 int n 中被接受,因为 nmax 在 int 的范围内
最佳答案
当 n 时,您的代码在
很大。n * (n - 1)
和 n * n
乘法中溢出了 int
的范围
这与操作顺序有关。例如,(n * n + n) % 1000007;
这里,首先计算n * n
。结果大于 int
的容纳范围,因此会出现整数溢出。由于溢出,生成的 int
值小于应有的值。对于这个太小的值,添加了n
。这会导致另一个太小的int
。这个太小的值除以2
。最后执行%
。
一个简单的解决方法是像这样声明 n
:
unsigned long long n;
通过将n
的类型更改为unsigned long long
,计算中的每一步都将是unsigned long long
类型,自第一个步骤的计算是在n
上进行的。
关于c++ - 下面程序中的整数溢出最大 int 1000 000(在 int 范围内),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54116813/