首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在将一个长数字分解为它的组成部分整数时出现奇怪的错误

在将一个长数字分解为它的组成部分整数时出现奇怪的错误
EN

Stack Overflow用户
提问于 2012-03-17 00:08:25
回答 2查看 180关注 0票数 2

这是Project Euler的第八个问题,它要求你在这个非常长的数字中找到连续五位数的最大乘积。

我的代码肯定不是最优雅的解决方案,但我很确定它应该可以工作。而且它似乎确实适用于小数字,但是一旦我测试的数字大于16位,所有的东西都开始分崩离析(例如,子集是e和0以及不同的数字,而不是实际给定数字中的数字)。

代码语言:javascript
复制
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的scratchpad测试它,也许这就是问题的一部分。我上周才开始学习js,昨天才开始学习这些Euler问题,所以我可以通过各种方式完全解决这个问题。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-17 01:38:59

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

但是大多数浏览器都有一个forEach方法,可以为您简化这一过程。

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2015-10-29 12:16:50

我最近刚刚开始研究Project Euler,并实现了一个常规的for循环,而不是采用forEach方法。

代码语言:javascript
复制
function largestProduct(n, d){
  var max = 0
  for(var i = 0; i < n.length - d; i++){
    var prod = 1;
    for(var j = 0; j < d; j++){  
      prod *= Number(n.charAt(i+j));
    }
    if(prod > max){
      max = prod;
    }
  }
  return max;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9740690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档