Toto je 8. otázka Project Euler, která vás žádá, abyste našli největší součin pěti po sobě jdoucích číslic v tomto jediném opravdu dlouhém čísle.
Můj kód rozhodně NE nejelegantnější řešení, ale jsem si jistý, že by mělo fungovat. A zdá se, že to funguje s malými čísly, ale jakmile je číslo, které testuji, větší než 16 číslic, všechno se začne rozpadat (např. podmnožiny dostávají e a 0 a různá čísla místo číslic ve skutečném daném čísle.)
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);
Testoval jsem to pomocí zápisníku Codecademy, možná je to součástí problému. Minulý týden jsem se začal učit js a tyto Eulerovy problémy jsem začal teprve včera, takže bych to mohl úplně pokazit celým vesmírem způsobů. Nějaké nápady?
Odpověď
Pokud předáte číslice jako řetězec, můžete použít svou metodu
ale většina prohlížečů má metodu forEach, která vám to může zjednodušit.
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