我正在尝试使用以下公式找到数字的LCM。 Lcm = Gcd /(a * b)。这适用于小数字,但是对于较大的数字,它会溢出,如代码中所示。我尝试使用long long作为变量类型但仍然没有效果。我如何解决溢出问题?
#include <iostream>
#include <vector>
using namespace std;
long long int LCM(int n1, int n2){
const int size = 2;
long long int sum;
long long int gcd;
long long int lcm = 0;
vector<int> number(2);
number[0] = n1;
number[1] = n2;
while (true)
{
sum = number[0] % number[1];
gcd = number[1];
if (sum == 0)
break;
number[0] = number[1];
number[1] = sum;
}
lcm = ((n1*n2)/gcd);
return lcm;
}
int main()
{
cout << LCM(28851538, 1183019) << endl;
system("pause");
}
答案 0 :(得分:4)
有一个微不足道的改进。
你计算(n1 * n2)/ gcd。如果n1 * n2太大而不适合int,那将会溢出。一个明显的变化是计算((long long)n1 *(long long)n2)/ gcd。只要n1 * n2不太大而不适合长长,就可以了。
但是假设你想用长参数来使用这个函数。然后记住gcd是n1和n2的最大公约数。所以它是n1的除数和n2的除数。所以你计算(n1 / gcd)* n2或(n2 / gcd)* n1,这将给出相同的结果。除非最终结果太大,否则不会溢出。
所以只需将return语句更改为
即可return (n1 / gcd) * n2;
答案 1 :(得分:2)
由于您知道gcd
均匀分为两个数字,因此只需更改操作的顺序:
lcm = n1*(n2/gcd);
答案 2 :(得分:0)
long long int LCM(int n1, int n2)
参数是int!
vector<int> number(2)
为什么再次使用int?
lcm = ((n1*n2)/gcd)
使用n1 / gcd * n2