我在Python中有一个工作算法,我想转换为C ++:
def gcd(a, b):
if (a % b == 0):
return b
else:
return gcd(b, a % b)
def solution(N, M):
lcm = N * M / gcd(N, M)
return lcm / M
我遇到大输入值的问题,因为N和M的倍数导致整数溢出并且使用long
来存储它的值似乎没有帮助,除非我做错了。< / p>
这是我目前的代码:
int gcd(int a, int b)
{
if (a % b == 0)
return b;
else
return gcd(b, a % b);
}
int solution(int N, int M) {
// Calculate greatest common divisor
int g = gcd(N, M);
// Calculate the least common multiple
long m = N * M;
int lcm = m / g;
return lcm / M;
}
答案 0 :(得分:1)
首先,改变:
long m = N * M;
int lcm = m / g;
要:
long long m = (long long)N * M;
int lcm = (int)(m / g);
通常,您也可以将代码中的每个int
更改为unsigned long long
...
但如果您手头有一些BigInt
课程,那么您可能想要使用它。
这是一个免费的:http://planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=9735&lngWId=3
它存储任何可想到的大小的自然数,并支持C ++中提供的所有算术运算符。
答案 1 :(得分:1)
您正在计算g=gcd(N,M)
,然后计算m=N*M
,然后计算lcm=m/g
,最后返回lcm/M
。这与返回N/gcd(N,M)
相同。您不需要那些中间计算。摆脱它们。现在溢出没有问题(除非M = 0,即你没有防范)。
int solution(int N, int M) {
if (M == 0) {
handle_error();
}
else {
return N / gcd(N,M);
}
}
答案 2 :(得分:-1)
问题出在long m = N*M.
乘法仅作为32位整数发生。由于两者都是int
类型,因此会发生溢出。
更正为long long m = (long long)N*M