我正在解决欧拉计划问题(目前在第13题)。
对于这个问题,我需要找出100个数字的总和的前10位数,这些数字的大小都类似于此:
91,942,213,363,574,161,572,522,430,563,301,811,072,406,154,908,250
我认为我可以使用类似Java的BigInteger,但我开始用JavaScript解决问题(我试图提高我的工作中js能力),我想继续使用它,甚至是解决这个问题。
如果可能的话,我想坚持纯JS。
我正在解决欧拉计划问题(目前在第13题)。
对于这个问题,我需要找出100个数字的总和的前10位数,这些数字的大小都类似于此:
91,942,213,363,574,161,572,522,430,563,301,811,072,406,154,908,250
我认为我可以使用类似Java的BigInteger,但我开始用JavaScript解决问题(我试图提高我的工作中js能力),我想继续使用它,甚至是解决这个问题。
如果可能的话,我想坚持纯JS。
BigInt
(截至2020年1月,已成为stage 4提案)。
https://github.com/tc39/proposal-bigint
Chrome、Firefox等浏览器已经在新版本中开始支持它(在这里检查兼容性),而其他浏览器仍在实现中。
https://developers.google.com/web/updates/2018/05/bigint
基本上,它可以使用字面量声明,例如:var a = 1n;
或者
var b = BigInt('22222222222222222222222222222222');
数学运算符不会自动转换BigInt和Number之间的类型,因此:1 + 1n
将会抛出一个错误。
var n = bigInt("91942213363574161572522430563301811072406154908250")
.plus("91942213363574161572522430563301811072406154908250");
function f(a) {
for (let i = 0; i < a.length - 1; i++) {
a[i + 1] = a[i + 1] + parseInt(a[i] / 10);
a[i] = a[i] % 10;
}
return a;
}
// remember to init the array with enough elements for all digits
var a = Array(200);
a.fill(0);
a[0] = 1;
这里是一个包含问题20代码的JSFiddle。
令人惊讶的是,将所有值放入数组中并将它们全部相加,然后只取前10位数字就可以了。之前当它不起作用时,我一定在代码中打错了某个字。
我确信这样做并不适用于所有情况(就像@AlexMcmillan和@zerkms一直在辩论的那些情况)。我认为最安全的方法是使用@bhspencer提到的BigInteger库,但在某些情况下,似乎也值得尝试将前x个有效数字与y个数字作为缓冲区相加。
var sum = 2384762348723648237462348;
sum = sum.toString(); // "2.3847623487236483e+24"
// Rip out the "."
sum = sum.substr(0, 1) + sum.substr(2);
// Grab the first 10 characters
var firstTen = sum.substr(0, 10);
var firstTen = sum.substr(0, 10);
- 你正在取出确切的10个数字。要精确地添加100个数字,你需要至少有3个以上的安全“缓冲区”。 - zerkmssum
变量完成了计算(因此命名为“sum”)。而且,OP只想要总和的前10个数字,因此返回13或15个数字是错误的。 :) - Alex McMillan