Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача о сумме четных чисел.

Автор: vell 30.09.2003 20:05

Нам задали 15 задач на Pascalе. Я решила 14, но последняя все никак не получается. sad.gif
Задача: Дано натуральное число N. Найти сумму четных цифр в данном числе.
Если кто знает, как её решать - подскажите, буду очень благодарна.

Автор: APAL 30.09.2003 20:29

Один из вариантов:
Преобразовать число в строковый тип и методом последовательного перебора символов этой строки найти нужную сумму.

Автор: vell 30.09.2003 22:12

Честно говоря, мне не очень понятно, как это выразить через программу... :'(

Автор: APAL 1.10.2003 11:44

Есть в 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 1.10.2003 17:38

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

Автор: APAL 1.10.2003 19:28

Можно еще вот так:

Код
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 1.10.2003 22:06

Цитата
Можно еще вот так:

Код
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 2.10.2003 11:06

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

Может я не все варианты оттестировал, но расхождений я не обнаружил.

Автор: orko 2.10.2003 20: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.

Автор: orko 2.10.2003 20:21

mlinn i chego eto ia napisal???
syt pochti takaya ze kak i u Apala....
ne doglyadel i ne podumal mlin...sorry smile.gif

Автор: ___ALex___ 2.10.2003 21:08

Код
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 3.10.2003 19:04

Какие-то ошибки

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

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 8.10.2003 7:43

А это-рекурсия.

Код
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 8.10.2003 7:44

слушайте, а что с отступами делается?

Автор: vell 23.10.2003 18:33

smile.gif Спасибо всем. Ваши подсказки мне очень помогли.  :)

Автор: vell 23.10.2003 18:35

P.S: я сдала зачет на пять.  ;)

Автор: orko 26.10.2003 1:56

ет  хорошо smile.gif

Автор: BE@ST 18.11.2007 1:04

Цитата(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 18.11.2007 1:21

попробуй так

while (n<>0) and ((n mod 10)<>0) then s:=s+a;

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

Автор: BE@ST 18.11.2007 1:33

Цитата(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 18.11.2007 1:48

Цитата
т.е. если я ввожу 24066 - мне выводило сумму 6 а не 18 !!!
А ты не в курсе, что сумма считается с младших, а не со старших разрядов, то есть "до нуля" - будет 6+6 = 12, а не 2+4 = 6

Автор: BE@ST 18.11.2007 1:55

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


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

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


Автор: Client 18.11.2007 1:55

если хочешь слева начать то надо найти как-бы разряд числа (для 46592 он будет 10000) а потом все просто..

Автор: volvo 18.11.2007 1:57

Цитата
для 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 18.11.2007 2:02

я так делал одну задачу, вот и вспомнил

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

это значит что можно тоьлько Integer максимум использовать?
Вот так просто ты ее решил)
Не могу переставать тебе удивляться..

Автор: BE@ST 18.11.2007 2:08

Цитата(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 18.11.2007 23:38

Цитата(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 18.11.2007 23:56

Поставь

 var s, a, n: LongInt;
для начала.

Автор: BE@ST 19.11.2007 12:23

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


спасибо )

помогло)