- Теория:
- Алгоритмы:
- Числа:
|
ГЛАВА 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.
|
|
|
|
|
|
|
|
|