На странице While17-21 решаем задачи о цифрах числа, точнее, вопросом об отделении цифр целого числа, пользуясь только операциями деления нацело **div**
и взятия остатка от деления **mod**
. Посмотрим, как это делается.
Для примера возмем целое число N=1234, имеющее четыре цифры. Если разделить это число на 10, то получим 123 целых и в остатке 4. Поэтому цифру 4 (остаток при делении на 10) можно вывести на экран, а в новое значение N записать 123. Потом эту процедуру повторяем еще столько раз, сколько цифр имеем (в данном случае 3). Для целочисленного деления используем функцию div, а для взятия остатка mod.
Важное замечание: сначала вычисляем последнюю цифру числа (остаток), а уже потом изменяем число (делим нацело на 10). Как только мы дойдем до последней цифры (выведем её на экран), тогда на следующем шаге целая часть превратится в 0. Смотрим на данном примере:
Как видно, на четвертом этапе (4 – количество цифр) число N = 0, поэтому делать вычисления следует до тех пор, пока N ≠ 0.
While17. Дано целое число N (> 0). Используя операции деления нацело и взятия остатка от деления, вывести все его цифры, начиная с самой правой (разряда единиц).
var
N: integer;
begin
write('N = ');
readln(N);
writeln;
writeln('Цифры числа (справа налево):');
while N > 0 do { <-- Выполняем цикл, пока число больше 0 }
begin
write(' ', N mod 10); { <-- выводим остаток деления на 10 }
N := N div 10 { <== находим целую часть от деления на 10 }
end;
readln
end.
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647A **mod** B
- остаток при целочисленном делении А на ВA **div** B
- целочисленное деление А на В Задача While17 с помощью цикла с постусловием repeat-until:
var
N: integer;
begin
write('N = ');
readln(N);
writeln;
writeln('Цифры числа (справа налево):');
repeat
write(' ', N mod 10); { <-- остаток деления на 10 }
N := N div 10 { <== целая часть от деления на 10 }
until N = 0; { <-- признак завершения цикла }
readln
end.
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647A **mod** B
- остаток при целочисленном делении А на ВA **div** B
- целочисленное деление А на В While18. Дано целое число N (> 0). Используя операции деления нацело и взятия остатка от деления, найти количество и сумму его цифр.
В этой задаче не нужно выводить цифры числа, но зато нужно их считать и суммировать. Поэтому для цифры вводим переменную c
, тогда Q
– количество, Sum
– сумма цифр.
var
N, c, Sum, Q: integer;
begin
write('N = ');
readln(N);
writeln;
Q := 0; { <== сначала количество цифр равно 0 }
Sum := 0; { <== сумма цифр тоже равна 0 }
while N > 0 do { <-- Выполняем цикл, пока число больше 0 }
begin
c := N mod 10; { <== последняя цифра числа }
inc(Q); { <== увеличиваем количество на 1 }
Sum := Sum + c; { <== увеличиваем сумму цифр }
N := N div 10 { <== удаляем последнюю цифру числа }
end;
{ Выводим полученные результаты: }
writeln(' количество цифр: ', Q);
writeln(' сумма цифр: ', Sum);
readln
end.
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647A **mod** B
- остаток при целочисленном делении А на В**procedure** Inc(**var** i: integer);
: Увеличивает значение переменной i на 1A **div** B
- целочисленное деление А на В Но как видно из программы, здесь спокойно можно обойтись и без переменнойс
– просто сразу вычислять сумму. Поэтому строку 12 можете удалить, а вместо 14 строки поставитьSum := Sum + N **mod** 10
.
While19. Дано целое число N (> 0). Используя операции деления нацело и взятия остатка от деления, найти число, полученное при прочтении числа N справа налево.
А это очень интересная задача – составить из данного числа новое "число-перевертыш", как его иногда ещё в шутку называют. Помотрим, как это сделать на конкретном примере вышеупомянутого числа N = 1234. Естественно, что мы хотим получить новое число M = 4321.
Делается это методом сдвига (как его можно назвать) цифр справа налево: каждый раз число M умножаем на 10 и прибавляем к нему последнюю цифру числа N (остаток от деления на 10), а само N после этого делим нацело на 10 (удаляем последнюю цифру). Заканчиваем тогда, когда N = 0.
var
N, M: integer;
begin
write('N = ');
readln(N);
M := 0; { <== начальное значение нового числа }
while N > 0 do { <-- Выполняем цикл, пока число больше 0 }
begin
M := 10 * M + N mod 10; { <== изменяем новое число }
N := N div 10 { <== удаляем последнюю цифру исходного числа }
end;
writeln;
writeln(' число справа налево: ', M);
readln
end.
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647A **mod** B
- остаток при целочисленном делении А на ВA **div** B
- целочисленное деление А на В While20. Дано целое число N (> 0). С помощью операций деления нацело и взятия остатка от деления определить, имеется ли в записи числа N цифра «2». Если имеется, то вывести true, если нет — вывести false.
Здесь все просто: находим последнюю цифру числа (остаток от деления на 10), а потом удаляем её (деление нацело на 10). Выполняем цикл до тех пор, пока одновременно найденная цифра не равна 2, а число не равно 0.
var
N, r: integer;
begin
write('N = ');
readln(N);
writeln;
while (N > 0) and (r <> 2) do
begin
r := N mod 10; { <== последняя цифра числа }
N := N div 10 { <== удаляем последнюю цифру }
end;
writeln(r = 2); { <-- выводим значение выражения (r=2) }
readln
end.
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647A **mod** B
- остаток при целочисленном делении А на ВA **div** B
- целочисленное деление А на В While21. Дано целое число N (> 0). С помощью операций деления нацело и взятия остатка от деления определить, имеются ли в записи числа N нечетные цифры. Если имеются, то вывести true, если нет — вывести false.
Как и в предыдущем примере, находим цифры числа, но проверяем на нечетность с помощью логической функции odd(N). Вместо этого можно использовать проверку на истинность выражения (N mod 2 = 1), возвращающее True, если N нечетно, и False в противном случае.
var
N, r: integer;
begin
write('N = ');
readln(N);
writeln;
while (N <> 0) and odd(r+1) do
begin
r := N mod 10; { <== последняя цифра числа }
N := N div 10 { <== удаляем последнюю цифру }
end;
writeln(odd(r));
readln
end.
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647**function** Odd(i: integer): boolean;
: Возвращает True, если i нечетноA **mod** B
- остаток при целочисленном делении А на ВA **div** B
- целочисленное деление А на В**function** Odd(i: integer): boolean;
: Возвращает True, если i нечетно Второй вариант решения задачи while21 отличается использованием логической переменной:
var
N, r: integer;
f: boolean; { <-- Если число N содержит нечетную цифру,
то f=True, в противном случае f=False }
begin
write('N = ');
readln(N);
writeln;
f := false;
while (N <> 0) and (f=false) do
begin
r := N mod 10; { <== последняя цифра числа }
N := N div 10; { <== удаляем последнюю цифру }
f := odd(r) { <== определяем, является ли r нечетным }
end;
writeln(f);
readln
end.
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647**type** boolean;
: Представляет логическое значение.**const** false = False;
: Представляет логическое значение.**const** false = False;
: Представляет логическое значение.A **mod** B
- остаток при целочисленном делении А на ВA **div** B
- целочисленное деление А на В**function** Odd(i: integer): boolean;
: Возвращает True, если i нечетно А вот решение той же задачи с использованием цикла с послеусловием repeat - until:
var
N, r: integer;
begin
write('N = ');
readln(N);
writeln;
repeat
r := N mod 10; { <== последняя цифра числа }
N := N div 10 { <== удаляем последнюю цифру }
until (N = 0) or odd(r);
{ Если в цикле мы дошли до последней цифры и
она четная, то функция odd(r) возвратит False,
в противном случае мы увидим True: }
writeln(odd(r));
readln
end.
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647A **mod** B
- остаток при целочисленном делении А на ВA **div** B
- целочисленное деление А на В**function** Odd(i: integer): boolean;
: Возвращает True, если i нечетно**function** Odd(i: integer): boolean;
: Возвращает True, если i нечетно