На билете шесть цифр – номер билета. Является ли данный билет счастливым? Счастливым считается билет, если сумма трех левых цифр равна сумме трех правых цифр.
Pascal | ||
|
всегда пишет,что несчастливый,в чем ошибка,заранее благодарен
Задача. Проверить, является ли четырехзначное число счастливым билетом. Дано четырехзначное число. Проверить, является ли оно «счастливым билетом».
Счастливым билетом называется число, в котором:
а) при четном количестве цифр в числе сумма цифр его левой половины равна сумме цифр его правой половины;
б) при нечетном количестве цифр – то же самое, но с отбрасыванием серединной цифры.
Например
Рассмотрим число 1322. Его левая половина равна 13, а правая – 22, и оно является счастливым билетом (т. к. 1 + 3 = 2 + 2).
Аналогично: 1735 (1 + 7 = 3 + 5), 1111 (1 + 1 = 1 + 1) и т. д.
Решение
Все, что необходимо сделать для решения задачи – это последовательно получить все разряды исходного числа, причем из двух младших разрядов (единиц и десятков) сформировать первую сумму, а из двух старших разрядов – вторую, после чего вывести на экран результат выражения равенства полученных сумм.
Первую сумму будем хранить в переменной right, а вторую – в переменной left (выбрано по расположению цифр в записи числа). Значение обоих из них не может превосходить 18 (т. к. для наибольшего допустимого числа 9999 обе суммы равны 9 + 9 = 18), поэтому для их описания используем тип integer.
Более детальный разбор алгоритма:
1) Вводим число n;
2) Присваиваем переменной right значение последней цифры числа n, потом отбрасываем эту цифру, затем повторяем то же самое, но на этот раз уже прибавляем добытую цифру к прежнему значению right:
right := n mod 10;
n := n div 10;
right := right + n mod 10;
n := n div 10;
3) Присваиваем переменной left последнюю цифру n, отбрасываем ее и прибавляем к right единственную оставшуюся в переменной n цифру:
left := n mod 10;
n := n div 10;
left := left + n;
4) Выводим на экран результат сравнения накопленных сумм:
writeln(left = right);
5) Сравниваем left и right — подводим итог:
if left = right then writeln(‘Билет является счастливым’) else writeln(‘Билет не является счастливым’);
Является ли четырехзначное число счастливым билетом
Код:
program Schastliviy_bilet;
var
n: integer;
left, right: integer;
begin
readln(n);
right := n mod 10;
n := n div 10;
right := right + n mod 10;
n := n div 10;
left := n mod 10;
n := n div 10;
left := left + n;
writeln(left=right);
if left=right then writeln(‘Билет является счастливым’)
else writeln(‘Билет не является счастливым’);
end.
Опубликовано: 24.03.2018
Обновлено: 15.03.2020
Формулировка. Дано натуральное число n. Проверить, является ли оно счастливым билетом.
Примечание: вообще, в математике обычно рассматриваются счастливые билеты с четным количеством цифр, потому что у них можно явно выделить левую и правую половины одинаковой длины, суммы цифр которых и сравниваются. Однако мы несколько расширим это определение, полагая, что если число имеет нечетную длину, его центральную цифру можно отбросить, так как ее логично было бы прибавить к накапливаемым суммам обоих половин, что, собственно, не изменит отношения между ними.
Например, число 14350 – счастливый билет, так как 1 + 4 = 5 + 0, а центральную цифру мы отбросили.
Решение. Задача является общим случаем задачи 10. Для ее решения необходимо знать длину числа (то есть его разрядность), вследствие чего нам необходимо скопировать переменную n в некоторую другую (например, a), чтобы на основе a посчитать количество десятичных разрядов n и сохранить его в некоторой переменной digits (digits в пер. с англ. означает «цифры»). Сделать это можно так:
a := n;
digits := 0;
while a <> 0 do begin
a := a div 10;
inc(digits)
end;
Здесь мы в каждой итерации цикла отбрасываем одну цифру от a и увеличиваем значение счетчика digits на 1. На некотором шаге число a будет однозначно и станет равным нулю при делении на 10, и после инкрементации счетчика, который теперь уже будет содержать количество цифр числа, произойдет выход из цикла.
Чтобы посчитать суммы левой и правой половины цифр числа (для накопления которых мы предусмотрим переменные leftи right), мы должны запустить два последовательных цикла от 1 до digits div 2, в которых прибавлять каждый полученный разряд к соответствующей переменной и отбрасывать его. Если длина нечетная, нам необходимо отбросить серединную цифру числа без прибавления к какой-либо сумме. Так как в первом цикле мы обработали и отбросили правую половину цифр числа, то по выходе из него серединная цифра как раз будет находиться в разряде единиц. Поэтому необходим следующий шаг:
if odd(digits) then n := n div 10;
Напомним, что функция odd(n) возвращает значение true, если n нечетно, и false, если n четно. То есть, написанный выше оператор проверяет счетчик digits (в котором хранится длина исходного числа) на нечетность, и если оно нечетно, отбрасывает последнюю его цифру.
Далее необходимо накопить сумму цифр левой половины числа и вывести на экран результат сравнения сумм левой и правой половины.
Код:
- program HappyTicket;
- var
- n, a: longint;
- left, right, digits, i: byte;
- begin
- readln(n);
- a := n;
- digits := 0;
- while a <> 0 do begin
- a := a div 10;
- inc(digits)
- end;
- left := 0;
- right := 0;
- for i := 1 to digits div 2 do begin
- right := right + n mod 10;
- n := n div 10
- end;
- if odd(digits) then n := n div 10;
- for i := 1 to digits div 2 do begin
- left:= left + n mod 10;
- n := n div 10
- end;
- writeln(left = right)
- end.
Представим, как должен работать алгоритм при вводе числа 14350:
1) Считаем длину числа, она равна 5 (строки 11-14);
2) В цикле из 5 div 2 = 2 повторений прибавляем к right крайние справа цифры 0 и 5, после чего отбрасываем их и имеем в n 143 (строки 17-20);
3) Так как odd(digits) = odd(5) = true, отбрасываем 3, после чего имеем в n 14 (строка 21);
4) В цикле из 5 div 2 = 2 повторений прибавляем к left оставшиеся цифры 1 и 4, после чего n становится равно 0, что, впрочем, нас уже не интересует (строки 22-25);
5) Выводим на экран значение выражения left = right – ответ положительный (строка 26).
Задание 1. Номер автобусного билета – шестизначное число ( первый билет 000000, второй 000001 и т.д.). Подсчитать число всех “счастливых” билетов (“счастливым” называется билет, у которого сумма первых трех цифр равна сумме трех последних).
output.txt |
Число счастливых билетов |
Указание: Решение задачи перебором всех шестизначных чисел превысит время тестирования.
Разделим число на две части по три цифры. организуем перебор всех цифр первой части от 000 до 999. Для каждого из этих чисел найдем сумму цифр и добавляем 1 в элемент массива А с номером, равным сумме цифр. В результате массив А заполнится количествами сумм цифр, где суммы цифр и соответственно номера элементов массива А принимают значения от 0 до 27.
Например, а[2] принимает значение, равное 6 (т.е. сумма цифр, равных 2, будет 6: 002, 011, 020, 101, 110, 200).
Если i – это сумма цифр трехзначного номера, то a[i] – количество всех трехзначных номеров с суммой цифр i. Тогда количество “счастливых” билетов с суммой первых трех цифр i для шестизначного номера составит a[i]*a[i], так как каждому из a[i] билетов первой тройки цифр найдется ровно a[i] билетов с суммой цифр i во второй тройке цифр.
Просуммировав все количества “счастливых” шестизначных билетов, для каждого i от 0 до 27 найдем общее количество “счастливых” билетов.
Посмотреть решение
Задание 2. Натуральное число из N цифр является числом Армстронга, если сумма его цифр, возведенных в N-ую степень, равна самому числу (как, например, 153=13+53+33). Получить все числа Армстронга, состоящие из двух, трех и четырех цифр.
Указание:
Рассмотреть три отдельных фрагмента программы для поиска двузначных, трехзначных и четырехзначных чисел Армстронга.
Двумя циклами по a и b сформируем все двузначные числа и выведем на экран те, для которых с1*с1+с2*с2=i, где двузначное число i составляется из цифр с1 и с2 по формуле i:=с1*10+с2. Аналогично для трехзначных и четырехзначных чисел.
Задание 3. Из одномерного массива, состоящего из N элементов, удалить те, которые встречаются только один раз. Массив сжать, т.е. на освободившиеся места передвинуть оставшиеся элементы массива, соблюдая порядок их первоначального расположения. Разрешается использовать только один массив (для исходных данных). Все числа натуральные <=100.
Ввод:
1 строка – N – количество элементов в массиве
2 строка – элементы массива
Вывод:
оставшиеся элементы массива
Пример:
Input.txt |
Output.txt |
4 2 5 2 7 |
2 2 |
Указание: Просматриваем элементы массива, пока не находим элемент. который не повторяется (a[i]). все элементы массива, находящиеся правее найденного, сдвигаем на один шаг влево. Количество элементов уменьшаем на 1 и с оставшимися элементами совершаем аналогичные действия с места последней остановки по индексу i.
Тесты Посмотреть решение
Задание 4. Дано натуральное число N (N<=999). Записать это число русскими словами (семнадцать, двести пятьдесят три).
Ввод:
1 строка – N – число
Вывод:
число словами
Пример:
Input.txt |
Output.txt |
25 |
двадцать пять |
Указание: найдем количество сотен (s), количество десятков (d) и количество единиц (e), а также число. содержащее две последние цифры (p) в заданном числе N.
Если p принадлежит промежутку 11..19, то нет необходимости выводить количество десятков и единиц и d=p, е=0.
Использовать команду case для сотен, десятков и единиц ( в команду выбора по десяткам добавить и числа от 11 до 19).
В зависимости от значений s, d, e находим части строки, из которых затем легко можно составить все название числа.
Тесты Посмотреть решение
Задание 5. В последовательности цифр а1, а2, а3,… каждый член, начиная с четвертого, равен последней цифре суммы трех предыдущих. Написать программу, которая по заданным а1, а2, а3 определяет aN для введенного N (n<=2000).
Ввод:
1 строка – три числа а1, а2, а3
2 строка – число N
Вывод:
аN
Пример:
Input.txt |
Output.txt |
2 4 9 5 |
8 |