一个奇怪的 C++ 错误,可能是相对于 long long 类型

A strange C++ error, maybe it is relative to the long long type

我的代码如下:

#include <iostream>
int gcd(int a, int b) {
  //write your code here
  if(a==0){
    return b;
  }else if(b==0){
    return a;
  }else if(a>b){
    int a_pri=a%b;
    return gcd(b,a_pri);
  }else if(a<b){
    int b_pri=b%a;
    return gcd(a,b_pri);
  }else{
    return a;
  }
}
long long lcm(int a, int b) {
  int temp_gcd = gcd(a,b);
  long long abproduct = a*b;
  long long result = abproduct/temp_gcd;
  return result;
}

int main() {
  int a, b;
  std::cin >> a >> b;
  std::cout << lcm(a,b) << std::endl;
  return 0;
}

我想输出两个数的最大公倍数。 但是当我输入两个数字 14159572 63967072 时,它输出一个负数 -527892768.But 正确答案应该是 226436590403296。 看起来输出被截断为 32 位。 所以,我打印变量 temp_gcd ,它是 4.I 改变了表达式

long long result = abproduct/temp_gcd;

long long result = abproduct/4;

然后输出正确答案。

问题在线long long abproduct = a*b;

由于ab都是int,对它们的任何操作都会导致int,在这种情况下会导致溢出。在计算时尝试将 ab 转换为 long long

long long abproduct = (long long)a * b;

不想编辑@MahlerFive 的答案 - 这应该也可以。我会像这样将 a 和 b 转换为 long long:long long abproduct = static_cast<long long>(a)*static_cast<long long>(b).

您正在执行 int 乘法,因为这是操作数的数据类型。更改该数据类型。即,改变

long long lcm(int a, int b)

long long lcm(long long a, long long b)

不要采纳使用强制转换的建议:强制转换应该永远是万不得已的措施,比如去 war(仅在政客和外交官失败后)。

如果您不更改函数签名,则可以通过将 a*b 替换为 1LL*a*b 来强制进行转换。但我不建议在这里。使用正确的数据类型是正确的方法。

还是代码

long long abproduct = a*b;
long long result = abproduct/temp_gcd;

不必要地添加结果可能溢出的情况。为了减少这种情况,

long long result = a*(b/temp_gcd);

注意这不能丢弃信息(不过,一般来说,您必须小心整数除法丢弃信息)。