Решение 50 типовых задач по программированию на языке Pascal Дата размещения сборника в сети
Задача № 37. Проверить, является ли натуральное число счастливым билетом
Download 1.52 Mb. Pdf ko'rish
|
Задачи на Pascal
- Bu sahifa navigatsiya:
- Данил Душистов: «Решение 50 типовых задач по программированию на языке Pascal» 45
- Решение.
Задача № 37. Проверить, является ли натуральное число счастливым билетом
Формулировка. Дано натуральное число n. Проверить, является ли оно счастливым билетом. Примечание: вообще, в математике обычно рассматриваются счастливые билеты с четным ко- личеством цифр, потому что у них можно явно выделить левую и правую половины одинаковой длины, суммы цифр которых и сравниваются. Однако мы несколько расширим это определение, полагая, что если число имеет нечетную длину, его центральную цифру можно отбросить, так как ее логично было бы прибавить к накапливаемым суммам обоих половин, что, собственно, не изме- нит отношения между ними. Данил Душистов: «Решение 50 типовых задач по программированию на языке Pascal» 45 Например, число 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 (в котором хранится длина исходного числа) на нечетность, и если оно нечетно, отбрасывает последнюю его цифру. Далее необходимо накопить сумму цифр левой половины числа и вывести на экран результат сравнения сумм левой и правой половины. Код: 1. program HappyTicket; 2. 3. var 4. n, a: longint; 5. left, right, digits, i: byte; 6. 7. begin 8. readln(n); 9. a := n; 10. digits := 0; 11. while a <> 0 do begin 12. a := a div 10; 13. inc(digits) 14. end; 15. left := 0; 16. right := 0; 17. for i := 1 to digits div 2 do begin 18. right := right + n mod 10; |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling