Это третья из моей серии головоломок 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 : Я редактировал последние вопросы, пожалуйста, прочитайте!
Задача состоит в том, чтобы решить обе части головоломки. Первый, кто это сделает, побеждает.
Я надеюсь, что все ясно, если нет, пожалуйста, напишите какие-либо вопросы, и я буду редактировать как можно быстрее. Приветствия. выделенный текст