2010-12-05 6 views
4

Donner N jours, avec le montant d'argent doublant chaque jour, est-ce le moyen le plus efficace pour y parvenir?L'algorithme javascript le plus efficace pour calculer le total si le montant devait doubler chaque jour

Premier jour: 0,5 $.
Jour deux: vous êtes donné deux fois le montant que le premier jour 1 $, maintenant vous avez 1,5 $
Jour trois: vous êtes donné deux fois le montant que le deuxième jour 2 $ et maintenant vous avez 3,5 $
Et ainsi de suite.

function calcit3() 
{ 
    var cur_total = .5; 
    var prev_total = 0; 
    var days = 20; 

    for (z = 1; z < days; z++) 
    { 
    cur_total = cur_total * 2; 
    prev_total = cur_total; 
    } 

    return (cur_total + prev_total); 
} 

Ceci est juste purement acedemic. Pas vraiment essayer de raser les cycles ou quoi que ce soit.

Merci.

EDIT:

alt text

+1

Est-ce que ce travail est fait? Non pas qu'il y ait quelque chose qui ne va pas, mais vous devriez l'étiqueter comme tel. –

+0

Na, pas de devoirs. Juste une question de watercooler et tout le monde a eu une réponse différente. – evets

+0

Heh, les observateurs de devoirs sont toujours en veille :) Évidemment, ce n'est pas le cas, car c'est un problème bien connu du cours d'algèbre scolaire http://en.wikipedia.org/wiki/Geometric_progression –

Répondre

9

Le code que vous avez fourni ne fait pas ce que la description dit qu'il devrait.

Si le montant initial est un le montant que vous obtenez sur le i e jour est a * 2^i, et la somme après n jours est la somme de ce 0-n.

Simplifying, nous obtenons:

a * (2^(n+1) - 1) 

Aucune boucle nécessaire.

+0

Oui. c'est mieux. – evets

7

Si je comprends bien le problème, c'est simplement un geometric progression commençant par 0,5 et doublant la valeur chaque jour. Le total est rien que la somme n termes de cette série, qui est:

a * (r^n - 1) 
------------- 
    r - 1 

Ici a = 0.5, r = 2; La formule donne substitution:

0.5 * (2^n - 1) 

en JavaScript ou de façon équivalente:

return 0.5 * (Math.pow(2, days) - 1); 
+0

Ce n'est pas la bonne réponse. Cela donne 524 287,5. Je crois que cela devrait aboutir à 393 216. – evets

+1

Compte tenu des règles que vous avez mises en avant, les maths ont raison. Comment obtiendriez-vous 393216.0 si chaque jour vous ajoutez un double de .5 (c'est-à-dire: chaque jour vous ajouteriez un nombre entier au total)? – cHao

+0

Ouais, désolé, mon erreur dans le cal. Tu as raison. Merci. – evets

0

Que diriez-vous:

return (Math.pow(2.0, days + 1) - 1) * initial_amount; 

Aucune itération nécessaire. Étant donné un montant initial de .5, après 1 jour, vous aurez (2^2-1) * .5 == 1,5, après 2 jours, vous aurez (2^3-1) *. 5 == 3,5,

Notez que ceci suppose initial_amount le jour 0, et non 1. Si vous voulez que le jour 1 soit le début, supprimez simplement le + 1 de l'expression.

Notez également, si vous parlez d'argent, la formule est un peu étrange. L'argent doublerait habituellement quotidiennement, comprenant le montant initial. Donc le jour 1, vous auriez 1 $, le jour 2 2 $, le jour 3 4 $, etc.

+0

Ce n'est pas intéressant pour l'argent. C'est juste une règle disant "hé, nous vous donnerons deux fois la somme d'argent comme la veille" à la fin de la période, combien aurez-vous. – evets

+0

Ensuite, vous finissez par ((2^fin) + (2^fin-1) + ... + (2^1) + (2^0)) * initial_amount. Cette série est égale à ((2^(fin + 1)) - 1) * initial_amount. – cHao

0

Est-ce correct?

return parseInt(Array(days).join('1'), 2) + 0.5 
+0

Une approche étrange, mais pourrait fonctionner pour un montant de départ de 0,5. Bien que vous puissiez facilement calculer le nombre sans avoir recours à la création d'un tableau jetable, en le rejoignant et en analysant la chaîne résultante comme un int ... – cHao

Questions connexes