プログラミングコンテストに参加するためのトレーニングをしていますので、そのような問題でよく慣れるようにしています。私は特に何かに問題を抱えてきました。驚くほど大きな数字のためにintがオーバーフローしました。この特定の問題が解決方法を知りたいと思います:Amelia and Rabbit Island。これは私のコードです:問題で大きな乗算をするときに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 (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;
}
それは、これはオーバーフローを避けることになっている、答えはMOD(1000000)で表現されなければならないことを言いますが、私はちょうどそれを動作させるための方法を見つけることができません、私の解決策は、正常値のために動作しますが、例えば入力の特定の場合:
1千10 10
単一の場合の最大許容入力されたことを、私が手に出力されます:
2998週で、我々は新たなウサギを0個得る。 どちらが間違っていますか?整数が乗算であふれているからです。
ありがとうございます。
編集:まあ、何らかの理由で、評価システムは今、miソリューション-.-を受け入れます。とにかく感謝します。
この問題は、1000000を使用するのが珍しい選択です。これらの問題の大部分は、30ビットしか必要としない素数であり、32ビットの符号なし整数をオーバーフローせずに2つの数値の1000000007を加算し、 mod 1000000007を実行する前に、64ビットの符号なし製品を使用して行われます。 – rcgldr