我试图查找两个数字的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。要解决此问题,您需要使a
,b
或g
成为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/