Beheben einer unterbrochenen Schleife durch Ändern genau eines Zeichens

Lesezeit: 3 Minuten

Benutzer-Avatar
Javier

ich fand eine Seite mit einigen komplizierten C-Puzzles. Ich beschäftige mich gerade damit:

Das Folgende ist ein Stück C-Code, dessen Absicht es war, ein Minuszeichen 20 Mal zu drucken. Aber das merkt man, das geht nicht.

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

Nun, das Korrigieren des obigen Codes ist einfach. Um das Problem interessant zu machen, müssen Sie den obigen Code beheben, indem Sie genau ein Zeichen ändern. Es gibt drei bekannte Lösungen. Sehen Sie, ob Sie alle drei bekommen können.

Ich kann nicht herausfinden, wie man es löst. Ich weiß, dass es durch Ändern behoben werden kann -- zu ++aber ich kann nicht herausfinden, welches einzelne Zeichen geändert werden muss, damit es funktioniert.

  • Ich denke nicht, dass dies “zu lokalisiert” ist. Während es in der realen Welt vielleicht nicht allzu nützlich ist, ist es ein interessantes Rätsel.

    – Javier

    23. März 2010 um 20:43 Uhr

  • Übrigens fehlt uns noch eine Lösung.

    – Javier

    23. März 2010 um 20:45 Uhr

  • @Felix: Nun, natürlich tun wir das jetzt nicht. Ich habe das geschrieben, als wir es waren.

    – Javier

    23. März 2010 um 21:06 Uhr

Benutzer-Avatar
Gab Royer

Hier ist eine Lösung:

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

Hier ist ein zweites, danke an Mark für seine Hilfe!

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

Und Mark hatte auch den dritten, der ist

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

  • Der zweite würde nicht funktionieren. Sie erhalten -20, -21, -22,.... Aber i + n Sollte es tun.

    – Felix Klinge

    23. März 2010 um 20:41 Uhr


  • Ich denke, das zweite braucht i+n statt i-n und du hast es. Nett.

    – Mark Wilkins

    23. März 2010 um 20:43 Uhr

  • Sie haben Recht! Ich war mir sicher, dass es irgendwie damit zusammenhängt, hatte aber die Hoffnung etwas früh im Prozess aufgegeben 😛

    – Gab Royer

    23. März 2010 um 20:47 Uhr


  • Das zweite ist genial. Vielen Dank. Danke auch an Mark, der offenbar viel dazu beigetragen hat.

    – Javier

    23. März 2010 um 20:50 Uhr

Benutzer-Avatar
Markus Wilkins

Veränderung i-- zu n-- ist ein anderer.

Okay – Gab hat das Problem behoben, also habe ich die andere Lösung entfernt. Er gewinnt!

  • @Gab: Heh – ich bin froh, dass du mich mit deinem um eine Minute geschlagen hast 🙂

    – Mark Wilkins

    23. März 2010 um 20:39 Uhr

  • Ich habe die andere Antwort akzeptiert, weil sie alle drei Lösungen enthält, aber vielen Dank.

    – Javier

    23. März 2010 um 20:51 Uhr

  • @Javier: Gute Entscheidung. Gab dachte an zwei, bevor ich es tat. Lustiges Problem.

    – Mark Wilkins

    23. März 2010 um 21:03 Uhr

Dritte Antwort:

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

Danke an Gab Royer für die Inspiration.

Erklärung: Irgendwann , i + n wird darin enden, dass -20 + 20 = 0 welches ist false.

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

i– in n– geändert

Hier ist einer davon, glaube ich:

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

Benutzer-Avatar
rlotun

Der Vergleich in der for-Schleife kann ein beliebiger Ausdruck sein – Sie können i negieren.

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

Benutzer-Avatar
Robert Davis

Lösung 1

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

Lösung 2

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

Habe kein drittes gerechnet.

1365320cookie-checkBeheben einer unterbrochenen Schleife durch Ändern genau eines Zeichens

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy