Pers.narod.ru. Алгоритмы. Сумма цифр целого числа |
Найти сумму цифр произвольного целого числа.
Число обозначим N, сумму цифр числа S, для общности назначим им тип Longint (длинное целое).
Очередную цифру L будем извлекать, беря остаток от деления N на 10: L:=N mod 10;
Естественно, после этого обработанную цифру надо убрать из числа N, чтобы не зациклиться: N:=N div 10;. В результате этого действия последняя цифра будет каждый раз отбрасываться, т.е., 345 превратится в 34, а ещё через шаг в 3.
Поскольку в числе должна присутствовать хотя бы 1 цифра, используем цикл с постусловием
repeat. Условием выхода из него может служить неравенство |N|<10 (осталась 1 цифра). При этом нужно не забыть про последнюю цифру числа.
var n,s:longint;
l:integer;
begin
{ввод данных с проверкой корректности}
repeat
writeln;
write ('Введите целое число:');
{$I-}readln(n);{$I+}
if IoResult<>0 then begin
write ('Ошибка ввода, пожалуйста, повторите');
continue
end
else break;
until false;
{реализация алгоритма}
s:=0;
repeat
l:=abs(n mod 10);
n:=n div 10;
inc(s,l);
until abs(n)<10;
inc(s,n);
write ('Сумма цифр числа=',s);
reset (input); readln;
end.
А впрочем, с условием n=0 тоже всё прекрасно должно работать
и отдельный учёт последней цифры не нужен, можно
обойтись вообще такой вот короткой версией (исключены также проверки корректности):
var n,s:longint;
begin
s:=0;
write('n='); read (n);
repeat
inc(s,n mod 10);
n:=n div 10;
until n=0;
write ('s=',s);
reset(input); readln;
end.
На Си, конечно, всё равно красивей:
#include <stdio.h>
void main () {
long n,s=0;
printf ("\nn="); fflush (stdin); scanf ("%ld",&n);
do {
s+=n%10;
n/=10;
} while (n);
printf ("\ns=%ld",s);
fflush (stdin); getchar ();
}
Следует только помнить, что Си, в отличие от Паскаля, не будет "ругаться"
на слишком большое число, например, превышающее значение константы MAXLONG,
равное 2 147 483 647 - просто введено будет не то значение,
которого Вы ожидали.
|
|