【问题标题】:Solving Project Euler 16 with Javascript用 Javascript 解决 Project Euler 16
【发布时间】:2012-03-23 04:05:28
【问题描述】:

我正在从事 Project Euler,用 JavaScript 编写解决方案。但是,问题 16 似乎无法用 Javascript 解决:

215 = 32768,其数字之和为 3 + 2 + 7 + 6 + 8 = 26。

数字21000的位数和是多少?

因为 JavaScript 的 64 位精度不足以容纳该数字,所以计算 Math.pow(2, 1000) 得到 1.0715086071862673e+301。显然,我不能使用这个值来解决问题,因为它不包含 21000 的所有数字。

还有其他方法可以解决这个问题吗?请注意,我不是在问how to get around the precision issue;但是,如果这是唯一的解决方案,那就这样吧。

理想情况下,我想为这个问题找到一个替代解决方案(也许是一种超级史诗般的数学方法?)。

(作为旁注,我并没有试图欺骗并从 SO 中放弃答案。我已经解决了,但我必须使用 Python)

【问题讨论】:

    标签: javascript


    【解决方案1】:

    可以通过将 2^1000 存储在一个数组(数字)中的简单方法来解决这个问题。在不到一秒钟的时间内运行。来自here的原创想法。

    var number = [1],
        sum = 0;
    
    for(var i = 0; i < 1000; i++)
    {
        var overflow = 0,
            count = number.length + 1
    
        for(var j = 0; j < count; j++)
        {
            var digit = number[j] || 0;
    
            digit = 2 * digit + overflow;
    
            if(digit > 9)
            {
                digit -= 10;
                overflow = 1;
            }
            else
            {
                overflow = 0;
            }
    
            number[j] = digit;
        }
    }
    
    for(var i = 0; i < 1000; i++)
    {
        sum += number[i];
    }
    
    console.log(sum);
    

    【讨论】:

      【解决方案2】:

      查看我之前提出的一个问题: summing exponents in javascript

      回复谈到了 JavaScript 中的 BigNumber。这应该可以帮助您解决 JavaScript 在处理大数字时的精度不足问题。

      【讨论】:

      • 就像我(有点)在我的问题中提到的那样,如果可能的话,我想避免这种解决方案,但如果这是唯一的方法,那就这样吧。暂时 +1,如果一天后没有更好的结果,我会标记为已回答
      猜你喜欢
      • 1970-01-01
      • 2016-04-30
      • 2013-12-24
      • 1970-01-01
      • 2023-02-13
      • 2011-03-03
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多