如何将此Python代码转换为C ++

时间:2014-02-22 21:32:18

标签: python c++ integer overflow

我在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;
}

3 个答案:

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