C++ 在执行大型乘法时避免int溢出
我正在接受参加编程竞赛的培训,所以我正在努力适应这类问题中的常见问题。我遇到了一些特别的问题:由于非常大的数字导致int溢出,有一个特别的问题我想知道如何解决:。这是我的代码:C++ 在执行大型乘法时避免int溢出,c++,modulo,integer-overflow,C++,Modulo,Integer Overflow,我正在接受参加编程竞赛的培训,所以我正在努力适应这类问题中的常见问题。我遇到了一些特别的问题:由于非常大的数字导致int溢出,有一个特别的问题我想知道如何解决:。这是我的代码: #include <iostream> int main(){ unsigned long long int a,b,c; int t; int nweeks; std::cin >> t; int **lines = new int*[t]; for
#include <iostream>
int main(){
unsigned long long int a,b,c;
int t;
int nweeks;
std::cin >> t;
int **lines = new int*[t];
for (size_t i = 0;i<t;i++)
lines[i] = new int[3];
for(size_t i=0;i<t;i++)
for(size_t j=0;j<3;j++)
std::cin >> lines[i][j];
for (size_t i=0;i<t;i++){
a = lines[i][1];
b = lines[i][2];
const unsigned int mod = 1000000;
for (size_t j=0;j<lines[i][0] - 2;j++){
if (j > 0){
c = a;
a = a * b % mod;
b = c;
}
else {
a = a * b;
}
}
nweeks = (lines[i][0] * 3) - 2;
std::cout << "At week " << nweeks << " we obtain " << a%mod << " new rabbits.\n";
}
for (size_t i=0;i<t;i++)
delete[] lines[i];
delete[] lines;
return 0;
}
#包括
int main(){
无符号长整型a,b,c;
int t;
国际周;
标准:cin>>t;
整数**行=新整数*[t];
对于(size_t i=0;i而言,您的输入选择很不幸
如果将两行添加到输出a
和b
,作为for
循环的最后一行
std::cout << "a: " << a << "\n";
std::cout << "b: " << b << "\n";
之后,a
和b
将继续为零。答案是正确的。输出模数100000确实为零
通过使用11088
作为输入,我得到以下输出:
a:64
b:8
a:512
b:64
a:32768
b:512
a:777216
b:32768
a:813888
b:777216
a:775808
b:813888
a:821504
b:775808
a:375232
b:821504
第28周,我们获得375232只新兔子。
尽管两组结果都是正确的,但它们看起来更容易接受。这个问题有一个不寻常的选择,即使用1000000。大多数问题都是100000007,这是一个只需要30位的素数,它允许两个mod 100000007的数字相加,而不会溢出32位无符号整数,乘法是典型的在执行mod 100000007之前,请先使用64位未签名产品。