ВХОД

МЕТОДИЧЕСКИЕ РАЗРАБОТКИ ПО КУРСУ ИНФОРМАТИКИ

"ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ PASCAL"

Начало > Глава II. Простые, Совершенные > Общие задачи с использованием этих алгоритмов

ГЛАВА II

ОБЩИЕ ЗАДАЧИ

Простые и совершенные числа.



1. Найти количество простых и совершенных чисел в интервале от 100 до 1200.
  Переход
Блок-схема

2. Найти первое простое число, сумма цифр которого совершенное число. (Вариант решения циклом Repeat)
  Переход
Блок-схема

2a. Найти первое простое число, сумма цифр которого совершенное число. (Вариант решения циклом While)
  Переход
Блок-схема

1. Найти количество простых и совершенных чисел в интервале от 100 до 1200.

Ответ: простых 171; совершенных 1.

При решении объеденены два алгоритма (поиск простых, поиск совершенных) в один.

program block2_01;
uses crt;
var ch, kd, del, sdel, chpr, chsov : integer;

    {ch - число;
    kd - количество делителей;
    del - делители;
    sdel - сумма делителей числа;
    chpr - количество простых чисел;
    chsov- количество совершенных чисел}

begin
clrscr;
chpr:=0; chsov:=0; {сначала количество простых и совершенных чисел равно 0}
for ch:=100 to 1200 do
    begin
    kd:=1;{само число: последний делитель, который не учитывается в последующем цикле}
    sdel:=0;
    for del:=1 to ch-1 do
      if ch mod del=0 then {ищем сразу количество и сумму делителей числа ch}
        begin
        inc(kd);
        inc(sdel,del)
        end;

    if kd=2 then inc(chpr);
    if sdel=ch then inc(chsov);
    end;

writeln('prost=',chpr, ' sover= ',chsov);
readkey
end.

2. Найти первое простое число, сумма цифр которого совершенное число.

(Вариант решения циклом Repeat)

Ответ: 1999.


program block2_02;
uses crt;
var ch, del, kd, cif ,sum, sd, ch1: integer;
p: boolean;

    {ch - проверяемое число,
    del - счетчик делителей,
    kd - количество делителей,
    cif - цифры числа,
    sum - сумма цифр числа,
    sd - сумма делителей числа,
    ch1 - дубликат проверяемого числа}
begin
    clrscr;
    ch := 2;
    p := false; {флаг для определения условия задачи}
    repeat
      ch1 := ch; {чтобы число ch не пропало, запомним его в переменной ch1}

      kd:=0; {алгоритм для определения простого числа}
      for del := 1 to ch do
        if ch mod del = 0 then inc(kd);
      if kd = 2 then {если число простое, то проверка продолжается, иначе начинаем проверять следующее число}
        begin

        sum:=0; {алгоритм для нахождения суммы цифр числа}
        while ch< >0 do
          begin
          cif:= ch mod 10;
          ch:= ch div 10;
          sum:=sum+cif;
          end;


        {далее проверим, является ли значение переменной sum совершенным числом:}
        sd:=0;
        for del:=1 to sum-1 do
          if sum mod del=0 then sd:=sd+del;

        if (sd=sum) then {если сумма цифр простого числа - совершенное число, то флаг равен true}
          begin p:=true; writeln('ch=',ch1); end;

        end;
      ch:=ch1+1; {подготовили следующее число для проверки}
    until p=true;
end.

2а. Найти первое простое число, сумма цифр которого совершенное число. (Вариант решения с циклом While)

Ответ: 1999.


program block2_02a;
uses crt;
var
ch, ch1, i, kd, sd, sum, a : integer;
r: boolean;
    {ch - проверяемое число;
    ch1 - дубликат числа ch;
    kd - количество делителей;
    i - делители;
    a - цифра числа;
    sum - сумма цифр числа;
    r - признак условия }
begin
clrscr;
ch:=2;
r:=false;
while (r=false) do { пока условие задачи ложь, выполняется цикл While}
    begin
    kd:=0; sd:=0; sum:=0; {начальные значения}
    ch:=ch1+1;
    ch1:=ch;
    for i:=1 to ch do {алгоритм поиска простых чисел}
      if ch mod i=0 then inc(kd);

    if kd=2 then {если количество делителей равно 2, следовательно число простое и имеет смысл дальнейшая проверка}
      begin
      while ch< >0 do {найдем сумму цифр числа}
        begin
        a:= ch mod 10;
        ch:= ch div 10;
        sum:=sum+a;
        end;

      {далее проверим, является ли значение переменной sum совершенным числом:}
      for i:=1 to sum-1 do
        if sum mod i=0 then sd:=sd+i;


      if (sd=sum) then
        begin
        r:=true; {если проверяемое число - совершенное, то условие - истинно и число выводится на экран}
        writeln('ch=', ch1)
        end;
      end;
    end;
end.

 

 

 

 

Copyright ©2011 Nika A.S.
Hosted by uCoz