Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача о сумме четных чисел.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
vell
Нам задали 15 задач на Pascalе. Я решила 14, но последняя все никак не получается. sad.gif
Задача: Дано натуральное число N. Найти сумму четных цифр в данном числе.
Если кто знает, как её решать - подскажите, буду очень благодарна.
APAL
Один из вариантов:
Преобразовать число в строковый тип и методом последовательного перебора символов этой строки найти нужную сумму.
vell
Честно говоря, мне не очень понятно, как это выразить через программу... :'(
APAL
Есть в TP такая функция преобразования числа в строку:

Код
function IntToStr(I: Longint): String;
{ Convert any integer type to a string }
var
S: string[11];
begin
Str(I, S);
IntToStr := S;
end;
begin
Writeln(IntToStr(-5322));
Readln;
end.


А дальше только перебирать посимвольно и используя CASE..OF.. считать сумму.

Попробуй сам продолжить..
Ivs
Преобразовывать в строку нежелательно. тем более вы могли этого еще не проходить, задача решается элементарно, если уж ты сделала остальные то эту не составит труда решить, просто, сдесь видимо необходимо немного подумать.
APAL
Можно еще вот так:

Код
Var
 N,S  : LongInt;
Begin
 S:=0;
 N:=1234567;
 Repeat
   If not Odd(N) then S:=S+(N mod 10);
   N:=N div 10;
 Until N<1;
 Writeln(s);
End.
Ivs
Цитата
Можно еще вот так:

Код
Var
 N,S  : LongInt;
Begin
 S:=0;
 N:=1234567;
 Repeat
   If not Odd(N) then S:=S+(N mod 10);
   N:=N div 10;
 Until N<1;
 Writeln(s);
End.


Ты проверяешь на четность само число, а надо цифру.
APAL
Правильно, четность определяется по последней цифре.
Потом делю на 10, тем самым передвигая запятую влево и отбрасывая остаток. Проверяю опять и так до тех пор число не будет менее 1.
Програмку проверял - работает.

Может я не все варианты оттестировал, но расхождений я не обнаружил.
orko
a mozno ety zadachy reshit tak???
vrode rabotaet no chet mne ne nravitsya v nei >:(

Код
uses crt;
var s,a,n:integer;
begin clrscr;
writeln('vvedite naturalnoe chislo');
readln(n);
s:=0;
while (n<>0)do begin
a:=n mod 10;
n:=n div 10;
if (((a mod 2)=0)and(a<10)) then s:=s+a;
end;
writeln('summa cifr... =',abs(s));
readln;
end.
orko
mlinn i chego eto ia napisal???
syt pochti takaya ze kak i u Apala....
ne doglyadel i ne podumal mlin...sorry smile.gif
___ALex___
Код
function SumEvenDigits(N: Integer): Byte;
const
HashTable: Array[0..9] of Byte = (0, 0, 2, 0, 4, 0, 6, 0, 8, 0);
begin

Result := 0;
repeat
 Inc(Result, HashTable[N mod 10]);
 N := N div 10;
until N = 0

end;
APAL
Какие-то ошибки

Вот результат работы данного кода:

123456
46
222
6
123
2
1234
6
12345
6
123456
46
654321
91

Сам код проги (на основе идеи ___Alex____):

Код
Uses Crt;
Var
 k : Longint;
function SumEvenDigits(N: Integer): Byte;
Var Result : LongInt;
const
HashTable: Array[0..9] of Byte = (0, 0, 2, 0, 4, 0, 6, 0, 8, 0);
begin

 Result := 0;
  repeat
    Inc(Result, HashTable[N mod 10]);
      N := N div 10;
  until N = 0;
 SumEvenDigits:=Result;
end;
Begin
ClrScr;
Repeat
Read(k);Writeln('  ',SumEvenDigits(k));
Until k=0;
end.
Fire_Rage
А это-рекурсия.

Код
uses crt;
var i,g:integer;

function symma(i:integer):integer;
var t:integer;
begin
 if i=0 then symma=0
          else  begin
                    t:=i mod 10;
                    if t mod 2 =0 then symma:=symma(i div 10)+t
                                        else symma:=symma(i div 10);
                  end;
end;

begin
 clrscr;
 readln(i);
 g:=symma(i);
 writeln(g);
end.
Fire_Rage
слушайте, а что с отступами делается?
vell
smile.gif Спасибо всем. Ваши подсказки мне очень помогли.  :)
vell
P.S: я сдала зачет на пять.  ;)
orko
ет  хорошо smile.gif
BE@ST
Цитата(orko @ 2.10.2003 15:19) *
a mozno ety zadachy reshit tak???
vrode rabotaet no chet mne ne nravitsya v nei >:(

Код
uses crt;
var s,a,n:integer;
begin clrscr;
writeln('vvedite naturalnoe chislo');
readln(n);
s:=0;
while (n<>0)do begin
a:=n mod 10;
n:=n div 10;
if (((a mod 2)=0)and(a<10)) then s:=s+a;
end;
writeln('summa cifr... =',abs(s));
readln;
end.




помогите плиз в этот код добавить условие: признак завершения число 0 - т.е. если я ввожу 24066 - мне выводило сумму 6 а не 18 !!!

Client
попробуй так
while (n<>0) and ((n mod 10)<>0) then s:=s+a;

сам не пробовал, но вроде должна работь..
BE@ST
Цитата(Client @ 17.11.2007 20:21) *
попробуй так
if ((a mod 2)=0)and(a<10) and ((n mod 10)<>0) then s:=s+a;

сам не пробовал, но вроде должна работь..




ввёл 24066 и выдало 10...



Добавлено через 10 мин.
Цитата(Client @ 17.11.2007 20:21) *
попробуй так
while (n<>0) and ((n mod 10)<>0) then s:=s+a;

сам не пробовал, но вроде должна работь..


так оно берёт числа справа а не слева ...

Код


uses crt;
var s,a,n:integer;
begin clrscr;
writeln('vvedite naturalnoe chislo');
readln(n);
s:=0;
while (n<>0) and ((n mod 10)<>0) do begin
a:=n mod 10;
n:=n div 10;
if (((a mod 2)=0)and(a<10)) then s:=s+a;
end;
writeln('summa cifr... =',abs(s));
readln;
end.


получилось 12...

volvo
Цитата
т.е. если я ввожу 24066 - мне выводило сумму 6 а не 18 !!!
А ты не в курсе, что сумма считается с младших, а не со старших разрядов, то есть "до нуля" - будет 6+6 = 12, а не 2+4 = 6
BE@ST
Цитата(volvo @ 17.11.2007 20:48) *
А ты не в курсе, что сумма считается с младших, а не со старших разрядов, то есть "до нуля" - будет 6+6 = 12, а не 2+4 = 6


хмм ... а нельзя ли как то сделать чтобы считало слева ?

зы только начал изучать smile.gif

Client
если хочешь слева начать то надо найти как-бы разряд числа (для 46592 он будет 10000) а потом все просто..
volvo
Цитата
для 46592 он будет 10000
46592 ты не запихаешь в Integer, для начала... Разговор о 16-битном компиляторе, а не о 32-битах.

Добавлено через 5 мин.
Кстати, достаточно сделать так:

uses crt;
var s, a, n: integer;
begin
clrscr;
writeln('vvedite naturalnoe chislo');
readln(n);

s := 0;
while n <> 0 do begin
a := n mod 10;

if a = 0 then s := 0
else begin
if a mod 2 = 0 then s := s + a
end;
n := n div 10;
end;

writeln('summa cifr = ', s);
readln;
end.

Client
я так делал одну задачу, вот и вспомнил
Цитата
Разговор о 16-битном компиляторе, а не о 32-битах.

это значит что можно тоьлько Integer максимум использовать?
Вот так просто ты ее решил)
Не могу переставать тебе удивляться..
BE@ST
Цитата(volvo @ 17.11.2007 20:57) *
46592 ты не запихаешь в Integer, для начала... Разговор о 16-битном компиляторе, а не о 32-битах.

Добавлено через 5 мин.
Кстати, достаточно сделать так:

uses crt;
var s, a, n: integer;
begin
clrscr;
writeln('vvedite naturalnoe chislo');
readln(n);

s := 0;
while n <> 0 do begin
a := n mod 10;

if a = 0 then s := 0
else begin
if a mod 2 = 0 then s := s + a
end;
n := n div 10;
end;

writeln('summa cifr = ', s);
readln;
end.



огромный тебе респект !

ты меня выручил!!!

BE@ST
Цитата(volvo @ 17.11.2007 20:57) *
46592 ты не запихаешь в Integer, для начала... Разговор о 16-битном компиляторе, а не о 32-битах.

Добавлено через 5 мин.
Кстати, достаточно сделать так:

uses crt;
var s, a, n: integer;
begin
clrscr;
writeln('vvedite naturalnoe chislo');
readln(n);

s := 0;
while n <> 0 do begin
a := n mod 10;

if a = 0 then s := 0
else begin
if a mod 2 = 0 then s := s + a
end;
n := n div 10;
end;

writeln('summa cifr = ', s);
readln;
end.



ааа ((( - я в панике,нашёл в ней ошибки,к примеру - ввёл 444011,а оно мне выдало сумму -8 (( , спрашивается откуда взялось отрицательно число и я заметил такого плана ошибки выскакивают почти всегда когда вводишь подряд одинаковые цифры (444023, 666021, 888056 и тд )

помогите плиз ((

Malice
Поставь
 var s, a, n: LongInt;
для начала.
BE@ST
Цитата(Malice @ 18.11.2007 18:56) *
Поставь
 var s, a, n: LongInt;
для начала.


спасибо )

помогло)

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.