2010-07-23 4 views
5

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

Я гремя мой мозг, но не был в состоянии решить эту проблему.не в состоянии решить загадку относительно этого кода

Удалить любой одиночный символ или оператор из выше коды и программа должна напечатать «-» 20 раз

Пожалуйста, помогите!

ответ

24

Я не думаю, что вы можете сделать это удаляемого характер, но у меня есть три решения, которые заменяющие (ну, один из них добавляет символ, но только потому, что у вас нет пробелов в вашей программе. Если бы у вас были пробелы, это заменило бы пространство).

Решение 1

int i,n=20; 
for(i=0;-i<n;i--) // -i < n 
    printf("-"); 

Раствор 2

int i,n=20; 
for(i=0;i<n;n--) // n-- 
    printf("-"); 

Раствор 3

int i,n=20; 
for(i=0;i+n;i--) // while i + n is not zero 
    printf("-"); 
+5

+1 - Я бы немного поцарапал себе голову, прежде чем придумать решение 3. –

1
int i,n=20; 
for(i=0;i<n;i--) //change i-- to i++ 
printf("-"); 

EDIT: Вы использовали оператор декремента вместо приращения. Таким образом, вы хотите, чтобы он продолжал увеличивать i до достижения 20. В какой момент он остановится, потому что тогда я бы не стал меньше 20, но равным.

+0

HOCUS POCUS - Вопрос говорит один персонаж, что вы сказали, пришло мне на ум ... но человек, спрашивающий меня, не счастлив. – Sadique

+0

«Удалите любой символ или оператор из кода выше» - вы заменили два символа. –

+0

Это не удаляет. Он меняет его на что-то другое. –

0

я могу сделать это с помощью добавления одного символа:

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

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

+0

Это будет печатать '-' около 2 миллиардов раз (на 32-битном процессоре). -20 меньше 20 ... -21 меньше 20 ... –

+2

Ну, если он печатает 2 миллиарда раз, он определенно напечатал бы 20 раз ... –

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

Я не знаю, если замена будет в порядке, но изменения i-- к N-, должны сделать трюк

+0

Держу пари, это то, что ищет позер. ;) –

+0

Да, это технически не «удаление», поэтому я не уверен. –

+0

@Heath - был «позер» фрейдистским промахом? :) –

5

Проблема, как заявлено, не имеет решения. Либо вы, либо тот, кто дал вам эту проблему, заявили об этом неправильно.

+3

Этот ответ требует формального доказательства. – intuited

+0

@intuited: Этот ответ допускает доказательство грубой силы, о котором уже упоминалось в некоторых других комментариях. Можно просто попробовать все возможные варианты. Я не вижу смысла публиковать такое доказательство в целом. Достаточно сказать, что я это сделал :) – AnT

+0

Я считаю, что не смогу опровергнуть ваше утверждение о том, что вы это сделали. :) –

0

Изменение:

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

к:

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

Но я не понимаю, как вы можете только удалить символ или оператора ... Вы должны изменить оператора или символ.

2

Головоломка должна допускать «изменение одного символа».

Растворы изменить < к +, изменить я к п, или изменить пространство, прежде чем я в середине для цикла к - (там должно быть пробелов.)

Ваш друг Безразлично» задайте вопрос.:-)

+0

Изменение < to > не работает ... –

+0

Вы правы, я сбивал с толку другой, но похожий тизер. :) кричит! исправлено – corsiKa

10

Я нашел ссылку на проблему на C Puzzles. (Это комментарий, так что это, конечно, не исходный источник.)

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

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

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

Обратите внимание, что инструкции говорят:

... вы должны исправить приведенный выше код, с помощью меняющегося ровно один символ.

Одним из решений является изменение i-- на n-- в заголовке цикла for.

+1

Это, конечно, другая проблема. В этой задаче разрешается только «удалить один символ или оператор». – AnT

+0

Хорошая находка. Я тоже пытался найти его, но ничего не мог найти. – spinon

+1

@spinon: У меня была неплохая идея, с чего начать искать. Очень сложно найти конкретный код C в широко открытом интернете. :) –

0

Прошло много лет с тех пор, как я сделал c, и я педантичен, поэтому, пожалуйста, простите меня, но ... разве программа не печатает «-» уже 20 раз? А потом некоторые?

Если вы удалите «f» из «printf», не продолжает ли он печатать «-» 20 раз? Как минимум?

Если это вопрос с подвохом, может быть, это трюк ...

1

Программа уже печатает - 20 раз - и затем он продолжает печатать намного больше позже. В головоломке не было необходимости печатать его точно 20 раз.

Если вам действительно нужно что-то удалить, вы можете получить подобное поведение, удалив оператор --.

int i,n=20; 
for(i=0;i<n;i) // no more decrement 
printf("-"); 

Другие символы, которые являются кандидатами для удаления, являются разрывами строк.

+0

почему бы не удалить первые 0? – mvds

+0

Это действительно другая возможность. –