Решение 50 типовых задач по программированию на языке Pascal Дата размещения сборника в сети


Задача № 37. Проверить, является ли натуральное число счастливым билетом


Download 1.52 Mb.
Pdf ko'rish
bet50/77
Sana03.02.2023
Hajmi1.52 Mb.
#1152062
TuriРешение
1   ...   46   47   48   49   50   51   52   53   ...   77
Bog'liq
Задачи на Pascal

Задача № 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; 



Download 1.52 Mb.

Do'stlaringiz bilan baham:
1   ...   46   47   48   49   50   51   52   53   ...   77




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling