Дано целое число (вводит пользователь), определить сумму его цифр, являющихся простым

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Ответить
Azura
Сообщения: 3
Зарегистрирован: 23 июн 2008, 09:53

Дано целое число (вводит пользователь), определить сумму его цифр, являющихся простыми числами.

Помогите, пожалуйста, решить задачку! Очень нужно! Желательно на Pascal и C++.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Простяе числа, меньшие 10 (т.е. те, которые являются цифрами) - это 2,3,5,7.
Либо:
1) брать остаток числа от деления на 10 (N mod 10), смотреть на принадлежность к [2,3,5,7], если принадлежить, то суммировать. Затем цисло делить целочисленно на 10 (N div 10) и, если результат больше 0, то читать сие предложение с начала.
Либо:
2) преобразовать число к строке (ф-я Str), затем перебирать по порядку символы строки, смотреть их принадлежность к ['2','3','5','7']. Если да, то преобразовать символ обратно в числи и суммировать.
Azura
Сообщения: 3
Зарегистрирован: 23 июн 2008, 09:53

BBB писал(а):Простяе числа, меньшие 10 (т.е. те, которые являются цифрами) - это 2,3,5,7.
Либо:
1) брать остаток числа от деления на 10 (N mod 10), смотреть на принадлежность к [2,3,5,7], если принадлежить, то суммировать. Затем цисло делить целочисленно на 10 (N div 10) и, если результат больше 0, то читать сие предложение с начала.
Либо:
2) преобразовать число к строке (ф-я Str), затем перебирать по порядку символы строки, смотреть их принадлежность к ['2','3','5','7']. Если да, то преобразовать символ обратно в числи и суммировать.

Спасибо большое, но не могли бы вы написать это в виде программы? Или исправить эту:

Код: Выделить всё

program prosto_chisla;
uses crt;
var n,i,symma,k,x:integer;
    p,pdel: Integer;
    numb: integer;
Function Prost (k:integer): boolean;
Begin
Prost:=true;
for i:=2 to x div 2 do
  if x mod i=0 then
    begin Prost:=false;
    end;
End;
Begin
clrscr;
 symma:=0;
 pdel:=0;
   Write('‚ўҐ¤ЁвҐ зЁб«® n: ');
   Readln(numb);
  {Val(numb, p, Code);
   if Code<>0 then Writeln('‚ўҐ¤Ґ*® *ҐўҐа*®Ґ зЁб«®: ',Code) Else Writeln('Ok!');
  until Code = 0;}
k:=0;
  while numb>0 do
    begin
    i:=numb mod 10;
    numb:=numb div 10;
    end;
 for i:=2 to (n-1) do begin
                    if n mod i = 0 then pdel:=pdel+1;
                                     end;
                    if pdel=1 then symma:=symma+i;
                    if pdel=1 then Write(i,' ');
                                     pdel:=0;

Writeln;
Writeln(symma);
readln;
{write('‡**®ў®(y/n)? ');
Readln(yn);
until yn='n';}
end.
BHy4ok
Сообщения: 237
Зарегистрирован: 01 май 2007, 09:03
Откуда: г.Находка
Контактная информация:

Вводимое число сделал типа "String", я думаю не будут предираться. Если же все таки будут вопросы, то либо сделай защиту от дурака на ввод чисел или-же просто как было предложено выше ставь тип "integer" и затем просто переводи его в строку. (str(x,s));
[syntax='Pascal']
uses
Crt;
var
i,j,k,p:integer;
n:string;
ch:set of char=['2','3','5','7']; // Простые числа
begin
ClrScr;
k:=0;
write('Vvedite chislo-> ');
readln(n);
for I := 1 to length(n) do
if n in ch then // Ищем простое число
begin
val(n,p,j); // Если число найдено, то переводим его в тип "integer"
k:=k+p; // Суммируем найденное число с уже имеющейся суммой предыдущих чисел.
end;
writeln;
writeln('summa prostih chisel = ',k); // Выводим сумму всех простых чисел на экран
readln;
end.
[/syntax]
< L3X. (ICQ: 8721378, Mail - l3x@list.ru)
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Зачем здесь массив А?
It's a long way to the top if you wanna rock'n'roll
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Azura писал(а):Или исправить эту:

Код: Выделить всё

program prosto_chisla;
uses crt;
var n,i,symma,k,x:integer;
    p,pdel: Integer;
    numb: longint;

Begin
 clrscr;
 symma:=0;
   Write('‚ўҐ¤ЁвҐ зЁб«® n: ');
   Readln(numb);

  while numb>0 do
    begin
      i:=numb mod 10;
      numb:=numb div 10;
      if (i in [2, 3, 5 ,7]) then symma:=symma+i;
   end;
Writeln;
Writeln(symma);
readln;
end.
BHy4ok
Сообщения: 237
Зарегистрирован: 01 май 2007, 09:03
Откуда: г.Находка
Контактная информация:

somewhere писал(а):Зачем здесь массив А?

Нету там массива "а", я его раньше убрал чем ты обновил страницу :) (Время обновления не смотри, были добавлены комментарии)
< L3X. (ICQ: 8721378, Mail - l3x@list.ru)
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

BHy4ok,
все-таки,
for I := 1 to length(n) do
а не
for I := 0 to length(n) do

И k предварительно обнулить.
BHy4ok
Сообщения: 237
Зарегистрирован: 01 май 2007, 09:03
Откуда: г.Находка
Контактная информация:

BBB писал(а):BHy4ok,
все-таки,
for I := 1 to length(n) do
а не
for I := 0 to length(n) do

И k предварительно обнулить.

Исправил.
Консольное приложение в делфе автовставками начинает его с нуля, иногда забываю исправлять.
< L3X. (ICQ: 8721378, Mail - l3x@list.ru)
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

BHy4ok писал(а): [syntax='Pascal']
if n in ch then // Ищем простое число
begin
val(n,p,j); // Если число найдено, то переводим его в тип "integer"
k:=k+p; // Суммируем найденное число с уже имеющейся суммой предыдущих чисел.
end;
[/syntax]

Это вполне заменяется на
if n in ch then k:=k+ord(n)-ord('0');
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Ответить