这是Project Euler的第八个问题,它要求你在这个非常长的数字中找到连续五位数的最大乘积。
我的代码肯定不是最优雅的解决方案,但我很确定它应该可以工作。而且它似乎确实适用于小数字,但是一旦我测试的数字大于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的scratchpad测试它,也许这就是问题的一部分。我上周才开始学习js,昨天才开始学习这些Euler问题,所以我可以通过各种方式完全解决这个问题。有什么想法吗?
发布于 2012-03-17 01:38:59
只要您将数字作为字符串传递,就可以使用您的方法,
但是大多数浏览器都有一个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发布于 2015-10-29 12:16:50
我最近刚刚开始研究Project Euler,并实现了一个常规的for循环,而不是采用forEach方法。
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;
}https://stackoverflow.com/questions/9740690
复制相似问题