找到第n个完美数

307 阅读1分钟

在做CS106B课程作业时,有一个函数是计算第n个完美数,当时就觉得恶心。 经过百度后才知道有个科学家证明了如何快速识别一个数是否是完美数。

bool isPrime(long n) {
    if (n < 2) {
        return false;
    }

    for (long i = 2; i <= n/2; i++) {
        if (n % i == 0) {
            return false;
        }
    }

    return true;
}

/*
* 欧拉证明了,当2^p-1是素数时,2^(p-1)*(2^p-1)是完美数
*/
long findNthPerfectEuclid(long n) {

    long p = 1; // 幂次方
    long num = pow(2, p) - 1;
    long i = 0;
    long result;

    while (i < n) {
        if (isPrime(num)) {
            result = (pow(2, p - 1) * (pow(2, p) - 1));
            i++;
        }
        p++;
        num = pow(2, p) - 1;
    }

    return result;
}