2011-04-30 4 views
2

J'essaie de calculer "2^0 + 2^1 + 2^2 + ... + 2^14", en utilisant le programme suivant (je suis un novice et ne peut calculer un exposant en se multipliant un certain temps). Le résultat devrait être 32767, mais je l'ai couru et obtenu 270.566.475, je pensais depuis longtemps, mais ne peut pas comprendre pourquoi ...Problème avec la boucle dans C

#include <stdio.h> 

int main(void) 
{ 
    int i, e, exponent, sum; 

    e = 1; 
    exponent = 1; 
    sum = 1; 

    for (i = 1; i <=14; i++) 
    { 
     for (e = 1; e <= i; e++) 
     { 
      exponent *= 2; 
     } 

     sum += exponent; 
    } 

    printf("%d\n", sum); 

    return 0; 
} 

Alors, quel est le problème avec ce ??? Merci!!!

Répondre

2

Regardez votre boucle intérieure par elle-même. Il essaie de calculer, pour une valeur spécifique de i, 2^i.

Mais exponent ne démarre pas à 1 à chaque fois. Donc, vous allez dans cette boucle avec exponent déjà une très grande valeur.

for (i = 1; i <=14; i++) 
{ 
    exponent = 1; 
    for (e = 1; e <= i; e++) 
    { 
     exponent *= 2; 
    } 

    sum += exponent; 
} 

Maintenant, vous avez remis à zéro exponent (qui, pour être clair, n'est pas l'exposant du tout, mais le résultat calculé) pour chaque nouvelle puissance de 2.

+0

Vous ne devez pas utiliser la boucle interne comme il peut être fait avec la boucle extérieure seulement, comme une réponse ci-dessus par Marcelo ..... – Pushpendra

+0

Oh, oui ~~ initialisation Merci beaucoup!! – asunnysunday

7

Vous n'avez pas besoin intérieur boucle. Exécutez simplement exponent *= 2 une fois, directement dans la boucle externe. BTW, je pense que vous devez le faire après le sum += ....

De plus, vous pouvez commencer par sum = 0 et i = 0, ce qui est plus proche des mathématiques que vous avez décrites.

+1

Ouais! ~~~ Après m'avoir dit cela, je ne sais vraiment pas pourquoi je l'ai fait de cette manière complexe, merci! – asunnysunday

2

Si vous avez le droit de créer une fonction mieux de le faire comme ça avec une fonction récursive:

#include <stdio.h> 

int power(int x, int exp) { 
    if (exp == 0) 
     return 1; 
    else 
     return x * power(x, exp-1); 
} 

int main (int argc, const char * argv[]) 
{ 
    int i; 
    int sum = 0; 
    for (i = 0; i <= 14; i++) { 
     sum += power(2, i); 
    } 

    printf("%d",sum); 
    return 0; 
} 

J'espère que ça aide.

Vous avez juste besoin d'une boucle car vous avez déjà le résultat de la valeur n-1. J'ai corrigé ton code ça marche.

#include <stdio.h> 

int main (int argc, const char * argv[]) 
{ 
    int i, e, exponent, sum; 

    e = 1; 
    exponent = 1; 
    sum = 1; 

    for (i = 1; i <= 14; i++) 
    { 
     exponent *= 2; 
     sum += exponent; 
    } 

    printf("%d\n", sum); 

    return 0; 
} 

Les deux codes travail

+1

Vous pouvez réutiliser cette fonction pour faire par exemple 3^3, 4^4 n'importe quelle valeur que vous voulez (x^exp). –

+0

Ne pas recommander la récursion où l'itération est demandée. (Et ne faites pas de solutions complexes à de simples erreurs.) –

+0

Oh, merci! mais pour moi des trucs comme le pouvoir, argc sont des symboles qui sont plus mystérieux que le latin maintenant, hehe ~~ merci beaucoup! – asunnysunday