Месяц находим методом половинного деления.
Двоичная запись числа 366 размещается в 9 битах (в 8 битах размещается только 256 чисел , а в 9 битах - уже 512).
То есть , понадобится задать 8 вопросов и девятой фразой будет ответ.
В году 365 (366) дней. Пусть 366, для 365 рассуждение то же.
Рассмотрим самый худший вариант
Середина года - день номер 366/2=183. Это 1 июля.
Первый вопрос: День рождения в первой половине года?
Допустим, да.
Второй вопрос: День рождения в первом квартале?
Допустим, нет. Следовательно во втором.
Второй квартал - это дни с номерами от 92 до 182. Середина - среднее арифметическое. (92+182)/2=137. Это дата 17 мая.
Третий вопрос: День рождения позднее 17 мая?
Допустим, нет.
Следовательно, интервал дат 1 апреля - 17 мая, 91 день. Опять делим на 2, сужая интервал до 22 дней. Это дата 22 апреля.
Четвертый вопрос: День рождения позднее 22 апреля?
Допустим, нет.
Новый диапазон поиска - 23 апреля - 17 мая. Половиним его.
Пятый вопрос: День рождения позднее 29 апреля?
Допустим, нет.
Поиск сузился до 23 - 29 апреля. Снова берем половину.
Шестой вопрос: День рождения позднее 26 апреля?
Допустим, нет.
Интервал дат 23-26 апреля. Половиним.
Седьмой вопрос: День рождения позднее 24 апреля?
Допустим, да.
Интервал дат 25-26 апреля.
Восьмой вопрос: День рождения 25 апреля?
Допустим, нет
Девятая фраза: Ваш день рождения 26 апреля.
using System;
public class Program
{
public static void Main()
{
/*Даны два целых числа: D (день) и M (месяц),
определяющие правильную дату невисокосного года. Вывести значения D и M для даты, следующей за указанной. */
int D = Convert.ToInt32(Console.ReadLine());
int M = Convert.ToInt32(Console.ReadLine());
switch (M)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
if (D == 31)
{
Console.WriteLine(D = 1);
Console.WriteLine(M = M + 1);
break;
}
else if (D > 31)
{
Console.WriteLine("Такой даты нет!");
break;
}
else
{
Console.WriteLine(D + 1);
Console.WriteLine(M);
break;
}
case 2:
if (D == 28)
{
Console.WriteLine(D = 1);
Console.WriteLine(M = M + 1);
break;
}
else if (D > 28)
{
Console.WriteLine("Такой даты нет!");
break;
}
else
{
Console.WriteLine(D + 1);
Console.WriteLine(M);
break;
}
case 4:
case 6:
case 9:
case 11:
if (D == 30)
{
Console.WriteLine(D = 1);
Console.WriteLine(M = M + 1);
break;
}
else if (D > 30)
{
Console.WriteLine("Такой даты нет!");
break;
}
else
{
Console.WriteLine(D + 1);
Console.WriteLine(M);
break;
}
case 12:
if (D == 31)
{
Console.WriteLine(D = 1);
Console.WriteLine(M = 1);
break;
}
else if (D > 31)
{
Console.WriteLine("Такой даты нет!");
break;
}
else
{
Console.WriteLine(D + 1);
Console.WriteLine(M);
break;
}
}
}
}
Объяснение:
{Первая задача}
var
s, rez: string; // строки
i: integer; // целое число (счетчик)
begin
writeln('Введите строку:');
readln(s); //
for i := length(s) downto 1 do // просматриваем буквы, начиная с последней
rez := rez + s[i]; // прибавляем букву к результату
writeln(rez) // выводим результат
end.