c++ - 将一段 C++ 翻译成 Python

标签 c++ python

我正在尝试将一些 C++ 转换为 Python。

C++ 可以在

https://gist.github.com/1635288

from prime import prime
from fractions import gcd
from copy import copy
def phi(n, primes):
    if n < 2:
        return 0

    if n in primes:
        return n - 1

    if (n & 1) == 0:
        m = n >> 1
        #return ~(m & 1) ? phi(m, primes) << 1 : phi(m, primes)
        if ~(m & 1):
            return phi(m, primes) << 1
        else:
            return phi(m, primes)

    for i in primes:
        if i > n:
            break

        if n % i:
            continue

        m = copy(i)
        o = n / m
        d = gcd(m, o)
        #return d == 1 ? phi(m) * phi(o) : phi(m) * phi(o) * d / phi(d)
        if d == 1:
            return phi(m, primes) * phi(o, primes)
        else:
            return phi(m, primes) * phi(o, primes) * d / phi(d, primes)

primes = []
for i in range(3, 10000000, 2):
    if prime(i):
        primes.append(i)

for i in range(80, 90): # a test to see if I am getting correct results
    print phi(i, primes)
    # returns   64, 54, 80, 82, 48, 64, 84, 56, 80, 88
    # should be 32, 54, 40, 82, 24, 64, 42, 56, 40, 88

基本上,该函数为奇数 n 返回正确的 phi 值,但为偶数 n 返回正确值的两倍。我怀疑我出错的地方是

m = copy(i)

而 C++ 是

int m = *p; 

我查阅了维基百科,发现这是将 m 定义为 p 指向 的值。这是问题吗?如果不是,那是什么?

最佳答案

我认为你应该使用 if not (m & 1),而不是 if ~(m & 1),因为前者是检查奇数/偶数数字,而后者只会在您将 -1 传递给它时返回 false

Tilde (~) 是位取反运算符。对于整数值,它认为 ~x == -x-1,在您的情况下根本不会发生。

关于c++ - 将一段 C++ 翻译成 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12037266/

相关文章:

python - 查找特定列的平均值并保留具有特定平均值的所有行

python - 使用 matplotlib 绘制数组列表

python - 如何将函数定义作为字符串传递给 python 脚本

c++ - 使用 C++ 从 URL 解析 JSON 数据

c++ - (C++) 寻找减少内存使用的技巧

c++ - 编译时重定义错误

c++ - 不可能的堆栈跟踪?尽管已检查,但使用this = nullptr的访问冲突

c++ - Qt 找不到插槽

python - tf.app.flags 是做什么的?为什么我们需要那个?

python - 重新排列 python pandas 数据框(部分转置)