【问题标题】:How to convert this Python code to C++如何将此 Python 代码转换为 C++
【发布时间】:2014-03-24 12:39:54
【问题描述】:

我有一个 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 存储其值似乎没有帮助,除非我做错了什么。

这是我当前的代码:

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

【问题讨论】:

  • 你向solution提供什么价值?
  • N 和 M 都在范围内 (1, 1 000 000 000)。
  • 嗯,一个快速的解决方案是使用long long。不过,这并不意味着较大的值都是安全的。
  • 但是N*M 在范围内吗?您可以尝试使用long long;在您的平台上,intlong 的大小可能相同。

标签: python c++ integer overflow


【解决方案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++ 中提供的所有算术运算符。

【讨论】:

  • 我已经尝试了这种方法的多种组合,但它似乎仍然不起作用。
  • 你没有说为什么这种方法行不通,玛丽安。您是否收到long long 的编译错误?这不是 C++03 的一部分,但它是一个相当标准的扩展。它是 C++11 的一部分。
  • 没有编译时错误,但结果仍然不正确。你可以在这里自己测试一下:codility.com/demo/take-sample-test/chocolates_by_numbers
  • 问题是int lcm = (int) (m/g)不正确。它必须是long long lcm = m / g
  • 好吧,正如我在答案中所说,您不妨将代码中的每个int 更改为unsigned long long
【解决方案2】:

问题出在long m = N*M. 乘法仅作为 32 位整数进行。由于两者都是int 类型,所以会发生溢出。

更正为long long m = (long long)N*M

【讨论】:

    【解决方案3】:

    您正在计算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);
       }
    }
    

    【讨论】:

    • 就是这个,很好看!我讨厌错过这样的东西。不需要错误处理,因为 M 和 N 都保证至少为 1。
    • 虽然答案避免了OP解决方案中的问题,但这并没有突出问题。最好了解 OP 解决方案中存在的实际问题。这个错误很常见,但经常被忽视。
    • 意图应该是“为什么我的解决方案不起作用”而不是“只给我正确的解决方案”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2019-09-29
    • 2011-12-08
    • 2017-05-10
    • 1970-01-01
    相关资源
    最近更新 更多