Это третья из моей серии головоломок C / C ++; в случае, если вы пропустили первые 2, они здесь: (1) головоломка программирования m3ph1st0s 1 (C ++) (2) головоломка программирования m3ph1st0s 2 (C ++): "Call hard!"
Надо сказать, что мои головоломки на 100% оригинальны. Если нет, я всегда буду утверждать это в тексте. Моя третья головоломка состоит из 2 частей:
Головоломка 3.1
Эта часть (3.1) не является моей оригинальной головоломкой, она взята с какой-то интернет-страницы, которую я читал некоторое время назад. Я использую это здесь как отправную точку и разминку для вас. Решите это, а затем переходите ко второй части.
Кто-то пытался напечатать знак «+» 20 раз и предложил следующую программу:
#include <stdio.h>
int main() {
int i;
int n = 20;
for( i = 0; i < n; i-- )
printf("+");
return 0;
}
Тот факт, что он не дал ожидаемого результата, очевиден - программа никогда не заканчивается. Почини это! Легко? Теперь исправьте программу, изменив ТОЛЬКО ОДИН ХАРАКТЕР - символ без пробелов! Для этой задачи есть 3 решения. Найдите все 3 из них. Просто чтобы прояснить: программа должна выводить 20 знаков «+» и должна быстро заканчиваться. Прежде чем критиковать меня за то, что означает «быстрый», я скажу, что это означает не более пары секунд (что, кстати, слишком много, но просто чтобы сделать его кристально ясным).
Головоломка 3.2
РЕДАКТИРОВАНИЕ Ранее мне указывалось, что решение головоломки 3.2.2 может зависеть от компилятора. Чтобы исключить любые возможные дискуссии на эту тему, я изменю идею и улучшу ее в следующей загадке, когда буду проявлять особую осторожность, чтобы не вызывать споров. Однако, чтобы эта головоломка продолжалась, я сделаю небольшую модификацию для 3.2.2 (решение будет проще, но чище).
Когда я впервые увидел головоломку, я нашел ее довольно крутой. Мне удалось решить это, но не сразу, поскольку это требует некоторого тщательного внимания. Если вы здесь, значит, вы тоже решили это. Если вы сделали это, написав программу для замены всех возможных символов всеми возможными значениями и проверки каждого решения, вы потерялись. Трудолюбивый парень, хотя. Теперь исправив программу, которая пишет 20 знаков «+»:
3.2.1. Вставьте одну единственную букву и ничего больше в код, чтобы результат был действительным и выводил одно и то же во всех 3 исправленных программах. Само собой разумеется, что письмо должно быть перед включением} main (я говорю это, потому что я не хочу слышать людей, которые просто помещают письмо после программы, и их компилятор был очень дружелюбен).
РЕДАКТИРОВАНИЕ (см. Ниже) - Для этих последних вопросов учтите, что счетчик i начинается с -1 вместо 0.
3.2.1.5: Повторите все предыдущие проблемы с условием, что на выходе должно быть не менее 19 знаков «+» (но все же конечный результат). Смена пробелов разрешена. Теперь вы могли бы найти больше решений, чем в первом случае. Некоторые из них наиболее точно подойдут для вопроса 3.2.2.
3.2.2: Выберите другое значение, чтобы инициализировать переменную n, чтобы результирующий вывод оставался неизменным по крайней мере для одной исправленной программы в 3.2.1.5 (не обязательно для всех из них).
ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ1 : изменение программы таким образом, чтобы она выводила 21 знак «+», все еще является хорошим решением, поскольку в исходном тексте не было «точно» 20 знаков. Однако бесконечный вывод запрещен. Очевидно, это не означает, что давайте все начнем выводить сотни знаков «+», поскольку это не запрещено. Но исключение прекрасного 21 результата не было бы в духе этого соревнования.
ПОСЛЕДНЯЯ РЕДАКТИРОВАТЬ2 : принимая во внимание ПОСЛЕДНЮЮ РЕДАКТИРОВАТЬ1 и принимая изменения пространства, кажется, что теперь у нас есть 5 возможных решений, четыре из которых уже были указаны в ответах. Последняя проблема, однако, не была затронута, и я должен прояснить это еще раз: n должно быть назначено другое значение , решения, которые назначают 20 на n с помощью некоторых приемов, не будут этого делать (например, n = 20L). Также я предпочитаю видеть 3-е решение, которое не меняет места.
ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ3 : Я редактировал последние вопросы, пожалуйста, прочитайте!
Задача состоит в том, чтобы решить обе части головоломки. Первый, кто это сделает, побеждает.
Я надеюсь, что все ясно, если нет, пожалуйста, напишите какие-либо вопросы, и я буду редактировать как можно быстрее. Приветствия. выделенный текст
источник
Ответы:
3,1
Любое из этих изменений приведет к тому, что программа выдаст 20 знаков «+». Этот близок:
Он выводит 21 знак «+».
3.2.1
Я нашел по крайней мере 112 способов решить эту проблему, вставив одно письмо. Не все из них могут работать на всех компиляторах.
Для последних двух, замените любое письмо,
x
чтобы дать вам 104 возможных решений. Использование любой из двух последних строк изменит выход, но вывод будет одинаковым для всех 3 исправленных программ.3.2.2
Все, что я придумал, - это некоторые вещи, которые возвращаются на номер 20 при назначении
int
.источник
f
иd
суффиксах дляint
типов (ну,d
для любого типа по этому вопросу), но есть и несколько других вы оставили от:int n = 20l
,int n = 20U
иint n = 20u
. Также я не верю,uint
что это стандартный идентификатор типа в C или C ++. Какой компилятор вы используете для них в любом случае?3,1
Еще одна загадка. Но нормальные решения скучны, а что-то особенное?
Решение первое:
Я решил изменить ТОЛЬКО ОДИН ХАРАКТЕР, то есть
-
. Нет символов, кроме-
были изменены.Решение второе:
Это меняет ровно один символ - точку с запятой после
int i
на=printf("++++++++++++++++++++");exit(0);
.Решение третье:
Это загружает
stdix.h
системный заголовок. В системный путь включения вставьте следующий файл с именем stdix.h. Он должен содержать следующее содержание.3,2
Теперь, чтобы вставить одну букву. Ну, это просто, заменить
int main()
наint main(a)
. Это не действует в соответствии со стандартами, но кого это волнует?источник
Головоломка 3.1 Ответы
i--
наn--
(демо: http://ideone.com/l0Y10 )i < n
наi + n
(демо: http://ideone.com/CAqWO )[SPACE]i < n
на-i < n
. (демо: http://ideone.com/s5Z2r )Головоломка 3.2.1
Изменить
int n = 20
наint n = 20L
(добавитьL
до конца).Головоломка 3.2.2
Пока не нашли ответ ...
источник
3,1
i--
наn--
i<n
в-i<n
3.2.1
в
(Зависит от компилятора ...)
3.2.2
печатает 19 + знаков, так же как и с
int n = 20L;
. Однако я бы не придумал, если бы не видел других ответов на 3.2.1.источник
источник