2010-03-23 15 views
27

J'ai trouvé a site avec quelques puzzles C compliqués. En ce moment je traite avec ceci:Correction d'une boucle brisée en changeant exactement un caractère

Ce qui suit est un morceau de code C, dont l'intention était d'imprimer un signe moins 20 fois. Mais vous pouvez le remarquer, cela ne fonctionne pas.

#include <stdio.h> 
int main() 
{ 
    int i; 
    int n = 20; 
    for(i = 0; i < n; i--) 
     printf("-"); 
    return 0; 
} 

Bien fixer le code ci-dessus est simple. Pour rendre le problème intéressant, vous devez corriger le code ci-dessus, en changeant exactement un caractère. Il existe trois solutions connues. Voyez si vous pouvez obtenir tous ces trois.

Je n'arrive pas à comprendre comment résoudre. Je sais qu'il peut être corrigé en changeant -- en ++, mais je ne peux pas comprendre quel caractère unique changer pour le faire fonctionner.

+1

Je ne pense pas que cela est « trop localisée ». Bien qu'il ne soit pas trop utile dans le monde réel, c'est un puzzle intéressant. – Javier

+0

BTW, il nous manque toujours une solution. – Javier

+0

@Felix: Eh bien, bien sûr, nous ne le faisons plus. J'ai écrit ça quand nous étions. – Javier

Répondre

34

est une solution ici:

for(i = 0; -i < n; i--) 
     printf("-"); 

est ici une seconde, grâce à Mark pour me aider!

for(i = 0; i + n; i--) 
    printf("-"); 

Et Mark avait aussi le troisième qui est

for(i = 0; i < n; n--) 
    printf("-"); 
+1

Le second ne fonctionnerait pas. Vous obtiendrez '-20, -21, -22, ...'. Mais 'i + n' devrait le faire. –

+0

En effet, je viens de le remarquer. –

+4

Je pense que le second a besoin de 'i + n 'plutôt que de' i-n' et vous l'avez. Agréable. –

17

changement i-- à n-- est une autre.

Okay - Gab a fait la correction, donc j'ai enlevé l'autre solution. Il gagne!

+0

N'a pas pensé à celui-ci! –

+0

@Gab: Heh - Je suis content que vous me battez d'une minute avec le vôtre :) –

+0

J'ai accepté l'autre réponse car elle comprend les trois solutions, mais merci beaucoup. – Javier

0

Voici l'un d'eux, je pense:

for(i = 0; i < n; n--) 
+0

Nice catch mate – MonoThreaded

2
for(i = 0; i < n; n--) 
    printf("-"); 

Changé je-- à n--

0

La comparaison dans la boucle peut être toute expression - vous pouvez annuler i.

for (i = 0; -i < n ; i--) 
7

Troisième réponse:

for(i = 0; i + n; i--) 
    printf("-"); 

Merci à Gab Royer pour l'inspiration. Explication: Éventuellement, i + n entraînera -20 + 20 = 0, ce qui correspond à false.

+0

a changé 2 caractères – MonoThreaded

+0

Aha, c'est intelligent !! – FrustratedWithFormsDesigner

+0

@ user294702: J'ai eu une erreur copier/coller, je l'ai corrigée. –

0

Solution 1

#include <stdio.h> 
int main() 
{ 
    int i; 
    int n = 20; 
    for(i = 0; i < n; n--) // Change i-- to n-- 
     printf("-"); 
    return 0; 
} 

Solution 2

#include <stdio.h> 
int main() 
{ 
    int i; 
    int n = 20; 
    for(i = 0; -i < n; i--) // Compare to -i 
     printf("-"); 
    return 0; 
} 

ne l'avez pas un tiers.

-1

Voici un autre:

#include <stdio.h> 

int main() 
{ 
    int i; 
    int n = -20; //make n negative 
    for(i = 0; i < n; i--) 
     printf("-"); 
    return 0; 
} 
+4

Ceci ne sera jamais exécuté, puisque 0> 20. La condition dans la boucle ne sera jamais vraie. – Javier