【问题标题】:Prime Factorization and Sum of Divisors not working?素数分解和除数之和不起作用?
【发布时间】:2013-09-07 04:42:07
【问题描述】:

因此,当我丢失了所有代码后,我重新启动了 Project Euler。我在problem 23。我知道该怎么做,而且我以前也做过,但现在不行,而且我一直在努力解决它很长时间,我几乎无法直截了当地思考。这次我使用的是 NodeJS。

根据this really simplified article,我可以使用素数分解来计算一个数字的除数之和。所以我有这两个功能:

Util.GetPrimeFactors = function (val) {
    var init = val;
    var num = 2;
    var primes = {};
    while (val > 1) {
        if (val % num == 0) {
            if (num == init) return [];// prevent prime numbers from including themselves
            if (primes[num]) {
                primes[num]++;
            } else {
                primes[num] = 1;
            }
            val /= num;
        } else {
            num++;
        }
    }
    return primes;
}

Util.SumOfDivisors = function (val) {
    var primes = Util.GetPrimeFactors(val);
    var coeff = primes[0];
    var count = 0;
    var total = 1;
    for (var i in primes) {
        count++;
        if (primes[i] > 1) {
            var n = parseInt((Math.pow(parseInt(i), primes[i] + 1) - 1) / (parseInt(i) - 1))
            console.log(n);
            total *= n;
        } else {
            var n = parseInt(i) + 1
            console.log(n);
            total *= n;
        }
    }
    if (count == 1) return 1;
    return total;
}

如果我调用GetPrimeFactors(12),我会得到这个对象:{ '2': 2, '3': 1 },它代表2^2+3,名称是基值,值是指数。 SumOfDivisors 使用该对象在上述链接文章中进行数学运算。问题是根据 Project Euler 问题,12 是第一个丰富的数字。如果我运行 6 到 SumOfDivisors,我会得到正确的素因子(对象 { '2': 1, '3': 1 }),但它会导致 SumOfDivisors 返回 12,使 6 看起来很丰富。如果您以低效的方式将因数相加(数学文章中的项目 B),那么您显然会得到因数 1、2 和 3,这使得 6 成为完美数。

我记得在我的旧 C# 代码中,我使用了相同的技术:查找素数并使用它们对除数求和。但是我没有这个问题 6 (可能还有更多的数字)。我在这里做错了什么,我很茫然。当我找到除数的总和时,我做错了什么?是否已知这种技术不适用于某些值?我是否对特殊情况感到震惊?我遇到了 Javascript 陷阱吗?

【问题讨论】:

    标签: javascript math


    【解决方案1】:

    您的代码完全按照文章所述进行。

    Project Euler 实际上要求的是适当除数的总和:

    28 将是 1 + 2 + 4 + 7 + 14 = 28

    虽然文章指定了正整数除数之和的算法:

    12 将是 1 + 2 + 3 + 4 + 6 + 12 = 28

    请注意,第一种情况不包括数字本身,而第二种情况则包括。这就是为什么 6 并不丰富(1 + 2 + 3 = 6),但它的整数因数之和是 12(1 + 2 + 3 + 6)。

    【讨论】:

    • 那么简单的答案是我应该从 SumOfDivisors 输出中减去这个数字?
    • 现在来解决为什么我的答案与实际答案相差 995...不过问题可能出在其他地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2021-12-03
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多