用 Javascript 解决 Project Euler 16
Posted
技术标签:
【中文标题】用 Javascript 解决 Project Euler 16【英文标题】:Solving Project Euler 16 with Javascript 【发布时间】: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)
【问题讨论】:
【参考方案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,如果一天后没有更好的结果,我会标记为已回答以上是关于用 Javascript 解决 Project Euler 16的主要内容,如果未能解决你的问题,请参考以下文章
MyEcplise导入项目报错:Errors running builder 'JavaScript Validator' on project '项目名'. ja
MyEclipse中点击Deploy MyEclipse J2EE Project to Server怎么没有反应