javascript - 将长数字分解为其组成整数时出现奇怪的错误

标签 javascript arrays

这是欧拉计划的第 8 题,要求你在这个非常长的数字中找到五个连续数字的最大乘积。

我的代码绝对不是最优雅的解决方案,但我很确定它应该可以工作。它似乎确实适用于小数字,但一旦我测试的数字大于 16 位数字,一切都会开始崩溃(例如,子集得到 e 和 0 以及不同的数字,而不是实际给定数字中的数字。)

function consecProduct(num,sec){
//converts the number to a string
var parser = num.toString();
var numLength = parser.length;
//prepares an array to hold 5 consecutive digits
var pieces = [];
var greatestProduct = 0;
var piecesTogether = 1;
// The outer loop that runs through each set of five digits
for (i=0; i<numLength-4; i++){
    //fills a string with the five digit subset
    var product = parser.substring(sec-5, sec);
    console.log("product "+product);
    //increments subset by 1
    sec++;
    //fills each array position with a each digit from subset
    for(x=0;x<5;x++){
        pieces[x]=product.substring(x,x+1);
        console.log(x + " is "+ pieces[x]);
    }
    //converts each array digit back to an integer
     for(x=0;x<5;x++){
        pieces[x]=parseInt(pieces[x]);
    }
    console.log("hey");
    //gets the product of the subset
    for(x=0;x<5;x++){
        piecesTogether = piecesTogether*pieces[x];
        console.log(pieces[x] + " work " + piecesTogether);
    }
    //updates the greatestProduct
    if ( piecesTogether > greatestProduct ){
        greatestProduct = piecesTogether;
        console.log("great product " + greatestProduct)
    }
    //resets the product for the next subset
    piecesTogether = 1;
}
return greatestProduct;
}
console.log("hey");
consecProduct(111125455578788855,5);

我一直在使用 Codecademy 的暂存器对其进行测试,也许这就是问题的一部分。我上周才开始学习 js,昨天才开始学习这些欧拉问题,所以我可以用各种方式完全解决这个问题。有什么想法吗?

最佳答案

只要您将数字作为字符串传递,就可以使用您的方法,

但大多数浏览器都有一个 forEach 方法可以为您简化它。

function eu8(s, n){
    var max= 0, last= 0, A= s.split(''), L= A.length,
    next, temp;
    A.forEach(function(itm, i, A){
        next= i;
        temp= itm;
        while(next<(i+n) && ++next<L) temp*= A[next];
        if(temp> max){
            max= temp;
            last= i;
        }
    });
    return [' Largest product in a sequence of '+n+' digits  totals '+max+
    ',\n found at digits #'+last+'-'+(last+n)+' : '+A.slice(last, last+n)];
}
// a shim for old browsers, (not needed with console):
if(!Array.prototype.forEach){
    Array.prototype.forEach= function(fun, scope){
        var T= this, L= T.length, i= 0;
        if(typeof fun== 'function'){
            while(i< L){
                if(i in T){
                    fun.call(scope, T[i], i, T);
                }
                ++i;
            }
        }
        return T;
    }
}
var s= '8383514919085125086820290424163504559356377168995032348562649291222000387486432845620761935475604819050366697920932015432273771435337266340072387705128115575935425014460947570294275818158944549440881025891661096019719598195504110300188717866666358085201663329077618987279717181749021476776048734274617619666392413744636813999541150937273597312043999174331828004915627872035802437409595473241982712379412840772356975718777505301009358387887491501687808639811743258849513533372548739871812190760522789399701735667528924543523146196411626759899045981351660803008793628326225793570101225880141881354855219845587323306406026446646995422604684079629891934580835393600990916331750430169147648113885025045982027652181257767798206409176994378464211282557774833632004180439443121563895765081630408290308927246861936209942841914894036534524282034126702443265629680626122703321065703277654006714223903324966372058553562951193965443957787594408861841150727372912209556865206484636763870595651959623483481581867874';



alert(eu8(s, 5));
//eu8(s, 5)
>>returned value:
 Largest product in a sequence of 5 digits  totals 204120,
 first found at digits #535-540 : 7,5,9,8,9

关于javascript - 将长数字分解为其组成整数时出现奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9740690/

相关文章:

javascript - 是否可以根据另一个表单的输入更改 HTML5 范围 slider 的最小值和最大值?

javascript - 更改克隆中的某些内容

c - 在 C 中的数组中存储相似的 union

java - 使用递归对二维数组中的整数求和?

java - 迭代所有不为空的槽,二维数组?

java - 一些垃圾值正在打印。为什么?

javascript - 如何修复此 AngularJS data-ng-init 绑定(bind) - 初学者

javascript - 检查输入字符串中是否至少出现一个非数值

javascript - 带有字符串的数组基于另一个带有对象的数组 [JS/TypeScript]

java - 将 ByteBuffer 分配给 Byte[] 错误