Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在执行大型乘法时避免int溢出_C++_Modulo_Integer Overflow - Fatal编程技术网

C++ 在执行大型乘法时避免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

我正在接受参加编程竞赛的培训,所以我正在努力适应这类问题中的常见问题。我遇到了一些特别的问题:由于非常大的数字导致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;
}
#包括
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位未签名产品。