较大值的答案溢出

Overflow of answer for larger values

本文关键字:答案 溢出      更新时间:2023-10-16

我正试图使用以下公式找到一个数字的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");
}

有一个微不足道的改进。

您计算(n1*n2(/gcd。如果n1*n2太大而无法放入整数,则会溢出。一个明显的变化是计算((long-long(n1*(long-leng(n2(/gcd。只要n1*n2不太大而不能放入long-long中,这就可以了。

但是,假设您要将此函数与长参数一起使用。请记住,gcd是n1和n2的最大公约数。它是n1的除数和n2的除数。因此,计算(n1/gcd(*n2或(n2/gcd(*n1,会得到相同的结果。除非最终结果太大,否则不会出现溢出。

所以只需将返回语句更改为

return (n1 / gcd) * n2; 

由于您知道gcd平分为两个数字,因此只需更改运算顺序:

lcm = n1*(n2/gcd);
long long int LCM(int n1, int n2)

参数为int!

vector<int> number(2)

为什么又是int?

lcm = ((n1*n2)/gcd)

使用n1/gcd*n2