我试图查找两个数字的lcm,对于一种输入情况(28851539和1183019),我的程序返回一个负值。显然,它无法计算(28851529 * 1183019)/ 9。

#include <iostream>
long long gcd(int a, int b) {
long long int temp;
if(a%b==0)
{
  return b;
}
else
{
 temp=a%b;
 return gcd(b,temp);
}
}
long long lcm(int a, int b , int g) {
//std::cout<<g;
long long int f=(a*b)/g;
return f;
}

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


我该如何准确计算?

最佳答案

你的问题是

long long int f=(a*b)/g;


由于(a*b)/g中的所有类型均为int,因此将被计算为int,如果int为16位或32位,则它将为overflow。请注意,由于您已经签署了类型,因此实际上是undefined behavior。要解决此问题,您需要使abg成为long long int,或者您可以更改函数的参数以使其全部成为long long int

long long int lcm(long long int a, long long int b , long long int g)


如果不处理负数,我还建议您使用unsigned long long int。如果不是,则可以使用uint64_t中的<cstdint>类型,否则使用int64_t来缩短类型名称。

关于c++ - C++中10 ^ 9中的数字计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36648642/

10-11 23:03
查看更多