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

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz