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
- просто введено будет не то значение,
которого Вы ожидали.
гостевая; E-mail |