Diskuze: Ukaž, co umíš? Faktoriál!
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 17 zpráv z 17.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
je nejaky casovy limit?
Pokud myslíš časový limit běhu programu, tak ... 10 sekund
Pokud myslíš časové omezení soutěže, nestojím si za žádným termínem. Uvidíme podle odezvy.
A pokud nějaký termín potřebuješ, tak tady je termín speciálně pro tebe: 16.11.2013 17:45:36
myslel jsem omezeni souteze
samozrejme lepsi bude bez limitu
jinak ma to fungovat tedy tak ze program bude scitat
10000 + 9999 ... 2 + 1 = vysledek?
Posílám řešení v JavaScriptu. V Chrome se do 10 sekund vejdu.
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8" />
<title>Ukaž, co umíš? Faktoriál!</title>
</head>
<script type="text/javascript">
function run(){for(var d=[0],c=[1],e=1;1E4>=e;e++){for(var a=0,b=c.length-1;0<=b;b--)a+=e*c[b],c[b]=a%10,a=Math.floor(a/10);for(;0<a;)c.unshift(a%10),a=Math.floor(a/10);for(var a=0,f=c.length-1,b=d.length-1;0<=b;b--)a+=d[b]+c[f--],d[b]=a%10,a=Math.floor(a/10);for(;0<=f;)a+=c[f--],d.unshift(a%10),a=Math.floor(a/10);for(;0<a;)c.unshift(a%10),a=Math.floor(a/10)}c=d.length+";";for(b=0;10>b;b++)c+=d[b];c+="...";for(b=d.length-10;b<d.length;b++)c+=d[b];document.body.innerHTML=c};</script>
<body onload="run()">
</body>
</html>
Mně to ve FF a Chromiu vypíše jen
35661;4579776707...0420940313
Ale pozor, výsledné číslo bude mít přes 35.000 číslic. Na konci vypište počet číslic v X a prvních několik číslic zepředu a zezadu.
35661 je počet číslic a zbytek je prvních několik číslic zepředu a zezadu.
Moc hezký pokus, pobavil jsi mě. Mám rád podobné funkce.
Bohužel, jsou zde dva malé problémy:
Držím palce.
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8" />
<title>Ukaž, co umíš? Faktoriál!</title>
</head>
<script type="text/javascript">function run(){for(var d=[0],c=[1],f=1;1E4>=f;f++){for(var a=0,b=c.length-1;0<=b;b--)a+=f*c[b],c[b]=a%10,a=Math.floor(a/10);for(;0<a;)c.unshift(a%10),a=Math.floor(a/10);for(var a=0,e=c.length-1,b=d.length-1;0<=b&&0<=e;)a+=d[b]+c[e],d[b]=a%10,a=Math.floor(a/10),b--,e--;for(;0<=e;)a+=c[e--],d.unshift(a%10),a=Math.floor(a/10);for(;0<a;)d.unshift(a%10),a=Math.floor(a/10)}c=d.length+" ";for(b=0;10>b;b++)c+=d[b];c+="...";for(b=d.length-10;b<d.length;b++)c+=d[b];document.body.innerHTML=c};</script>
<body onload="run()">
</body>
</html>
Teď už je výsledek správný, gratuluji!
Ale algoritmus lze napsat ještě jednodušším způsobem, dokážeš na to
příjít?
To je pravda, nicméně asymptotická složitost je stejná jako v případě
mého prvního naivního řešení
Nejraději mám úlohy, kdy první "blbé" řešení nefunguje vůbec a je
potřeba vymyslet něco lepšího.
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8" />
<title>Ukaž, co umíš? Faktoriál!</title>
</head>
<script type="text/javascript">function run(){for(var c=[1],b=1E4;1<b;b--){for(var a=1,d=0;d<c.length;d++)a+=b*c[d],c[d]=a%10,a=Math.floor(a/10);for(;0<a;)c.push(a%10),a=Math.floor(a/10)}a=c.length+" ";for(b=c.length-1;b>c.length-11;b--)a+=c[b];a+="...";for(b=9;0<=b;b--)a+=c[b];document.body.innerHTML=a};</script>
<body onload="run()">
</body>
</html>
Pro takhle malá čísla není důležitá asymptota, ale velikost konstanty. Ale řešení už je správné.
V C# trvá výpočet cca 0.5 sekundy (Core i5 2.8GHz)
Čistě pro zajímavost... Nedávno jsem pomáhal kamarádovi se zápočtovou úlohou a kód v C# byl asi o 10% rychlejší, než C-čkový kód pod GCC. Stejně tak Apple uvádí, že CLang compiler je o 20-50% rychlejší než GCC.
Zkusím to napsat ve Fortranu, mělo by to být ještě o něco rychlejší.
Zobrazeno 17 zpráv z 17.