Сумма цифр числа
Берите последнюю цифру через mod 10 и отбрасывайте её через div 10, пока число не станет нулём:
program DigitSum;
var
n, sum: longint;
begin
readln(n);
n := abs(n);
sum := 0;
while n > 0 do
begin
sum := sum + n mod 10;
n := n div 10;
end;
writeln('Сумма цифр: ', sum);
end.4096Сумма цифр: 19Как идёт цикл для 4096:
| n | n mod 10 | sum | n div 10 |
|---|---|---|---|
| 4096 | 6 | 6 | 409 |
| 409 | 9 | 15 | 40 |
| 40 | 0 | 15 | 4 |
| 4 | 4 | 19 | 0 |
На нуле цикл останавливается.
Отрицательные числа и ноль
abs(n)убирает минус. Без него у отрицательного числаn mod 10даёт отрицательные «цифры», а циклwhile n > 0не выполнится ни разу.- Для числа 0 сумма цифр — 0, и программа так и выведет. А вот количество цифр у нуля — одна, поэтому для подсчёта цифр берут
repeat … until n = 0: тело выполнится хотя бы раз. - Тип
longint— чтобы влезли числа больше 32 767: в Free Pascalintegerпо умолчанию меньше.
Тот же приём для других задач
program DigitTasks;
var
n, count, prod, rev, d: longint;
begin
readln(n);
count := 0;
prod := 1;
rev := 0;
repeat
d := n mod 10;
count := count + 1;
prod := prod * d;
rev := rev * 10 + d;
n := n div 10;
until n = 0;
writeln('Цифр: ', count);
writeln('Произведение цифр: ', prod);
writeln('Наоборот: ', rev);
end.1234Цифр: 4
Произведение цифр: 24
Наоборот: 4321- Количество цифр — счётчик
count. - Произведение цифр — копилка начинается с 1, а не с 0.
- Число наоборот —
rev := rev * 10 + dдописывает очередную цифру справа.
Программа рассчитана на неотрицательные числа; для отрицательных добавьте n := abs(n) после ввода.
Через строку
Если число записано строкой (или очень длинное), цифры берут по символам: ord(s[i]) - ord('0'). Пример — в справке Как перевести число в строку и обратно.
Подводные камни
- Сумма не обнулена перед циклом. Переменные программы обнуляются сами, но в процедуре или функции в Free Pascal в
sumможет лежать «мусор», а при подсчёте для нескольких чисел подряд — сумма прошлого числа. /вместоdiv.n := n / 10не скомпилируется: результат/дробный.- Число испорчено. Цикл «съедает»
nдо нуля. Если исходное число ещё понадобится, сначала сохраните его копию:m := n.