更大值的答案溢出

时间:2016-08-19 19:02:17

标签: c++ lcm

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

}

3 个答案:

答案 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