2010-03-23 5 views
27

Я нашел a site с некоторыми сложными головоломками C. Сейчас я имею дело с этим:Фиксация сломанной петли, изменяя ровно один символ

Ниже приведен фрагмент кода C, целью которого было напечатать знак минус 20 раз. Но вы можете заметить, что это не работает.

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

Хорошо фиксирующий вышеуказанный код является прямым. Чтобы сделать проблему интересной, вы должны исправить вышеуказанный код, изменив ровно один символ. Существует три известных решения. Посмотрите, сможете ли вы получить все эти три.

Не могу понять, как решить. Я знаю, что его можно исправить, изменив -- на ++, но я не могу понять, какой единственный символ нужно изменить, чтобы он работал.

+1

Я не думаю, что это «слишком локализованы». Хотя это может быть не слишком полезно в реальном мире, это интересная головоломка. – Javier

+0

Кстати, мы все еще не нашли ни одного решения. – Javier

+0

@ Феликс: Ну, конечно, теперь мы этого не делаем. Я написал это, когда мы были. – Javier

ответ

34

Вот одно решение:

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

Вот второй один, благодаря Марку за помощь мне!

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

И Марк также был третий, который

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

Второй не сработает. Вы получите '-20, -21, -22, ...'. Но 'i + n' должен это делать. –

+0

Действительно, я только что заметил это. –

+4

Я думаю, что второй нужен 'i + n', а не' i-n', и у вас это есть. Ницца. –

17

Изменение i-- для n-- это совсем другое.

ОК - Габ сделал исправление, поэтому я удалил другое решение. Он побеждает!

+0

Не думал об этом! –

+0

@Gab: Хех - Я рад, что вы избили меня минутой с вашей :) –

+0

Я принял другой ответ, потому что он включает в себя все три решения, но очень спасибо. – Javier

0

сравнения в для цикла может быть любое выражение - вы можете отрицать я.

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

Третий ответ:

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

Благодаря Габ Royer для вдохновения.

Объяснение: В конце концов, i + n приведет к -20 + 20 = 0, который составляет false.

+0

изменен 2 символа – MonoThreaded

+0

Ага, это умно! – FrustratedWithFormsDesigner

+0

@ user294702: У меня была ошибка копирования и вставки, исправлена. –

0

Решение 1

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

Раствор 2

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

не понял третий.

-1

Вот еще один:

#include <stdio.h> 

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

Это никогда не будет работать, так как 0> 20. Условие в цикле никогда не будет истинным. – Javier

 Смежные вопросы

  • Нет связанных вопросов^_^