- Теория:
- Алгоритмы:
- Числа:
|
ГЛАВА IV
ЗАДАЧИ С РЕШЕНИЯМИ
Дружественные числа
|
1. Составить программу, которая находит все дружественные числа в интервале [1; 10000].
2. Найти количество пар дружественных чисел в интервале [100; 10 000].
3. Проверить утверждение: четырехзначных дружественных чисел больше, чем трехзначных.
|
1. Составить программу, которая находит все дружественные числа в интервале [1; 10000].
Ответ:
Программа, находящая все дружественные
числа в интервале от 1 до 10000
Числа 220 и 284 - дружественные
Числа 284 и 220 - дружественные
Числа 1184 и 1210 - дружественные
Числа 1210 и 1184 - дружественные
Числа 2620 и 2924 - дружественные
Числа 2924 и 2620 - дружественные
Числа 5020 и 5564 - дружественные
Числа 5564 и 5020 - дружественные
Числа 6232 и 6368 - дружественные
Числа 6368 и 6232 - дружественные
Программа завершена.
program dr_01;
uses crt;
var
a: longint;
b, i, s, s1: integer; {a - первое число;
b -
делители числа s;
i -
делители числа a;
s -
сумма делителей первого числа;
s1 -
сумма делителей s}
begin
clrscr;
writeln ('Программа, находящая все дружественные');
writeln ('числа в интервале от 1 до 10000');
for a:= 2 to 10000 do {цикл для проверки первых чисел}
begin
s:=0;
for i:= 1 to a-1 do {находим все делители числа а,
исключая само число}
if a mod i = 0 then s:= s+i; {находим сумму делителей числа а}
s1:=0;
for b:= 1 to s-1 do {цикл для проверки вторых чисел,
которые являются суммой делителей первого числа}
if s mod b = 0 then s1:= s1 +b; {находим все делители чила s
(сумма делителей числа а)}
if (s1=a) and (s< >a) then writeln ('Числа ', a, ' и ',s,' - дружественные'); {сумма делителей суммы делителей числа а должна быть равна числу A, а сумма делителей числа A не должна быть равна этому числу} end;
writeln('Программа завершена') {для визуального контроля: выполнение программы может занимать некоторое количество времени}
end.
|
2. Найти количество пар дружественных чисел в интервале [100; 10 000].
Ответ:
220 284
1184 1210
2620 2924
5020 5564
6232 6368
kol=5
program dr_02;
uses crt;
var a,s,b,i,s1,kol:integer;
{a - первое число;
b -
делители числа s;
i -
делители числа a;
s -
сумма делителей первого числа;
s1 -
сумма делителей s;
kol - количество пар дружественных чисел
}
begin
clrscr;
kol:=0;
for a:=100 to 10000 do
begin
s:=0; {для каждого числа a будем искать свою сумму делителей, поэтому сначала она равна 0}
for i:=1 to a-1 do
if a mod i=0 then s:=s+i; {нашли сумму делителей числа a}
s1:=0;
for b:=1 to s-1 do
if s mod b=0 then s1:=s1+b; {нашли сумму делителей для s}
if (s1=a) and (s< >a) and (s>a) then {условие s>a для отсечения повторяющихся пар чисел}
begin
inc (kol);
writeln(a:10,b+1:10)
end;
end;
writeln ('kol=',kol);
end.
|
3. Проверить утверждение: четырехзначных дружественных чисел больше, чем трехзначных.
Ответ:
220 284
1184 1210
2620 2924
5020 5564
6232 6368
kol 3zn =1
kol 4zn =4
True
program dr_03;
uses crt;
var a,s,b,i,s1,k:integer; kol_3zn, kol_4zn:integer;
p:boolean;
{a - первое число;
b -
делители числа s;
i -
делители числа a;
s -
сумма делителей первого числа;
s1 -
сумма делителей s;
k - количество пар дружественных чисел;
kol_3zn - количество пар 3-значных чисел;
kol_4zn -
количество пар 4-значных чисел}
begin
clrscr;
k:=0;
for a:=100 to 9999 do begin
s:=0;
for i:=1 to a-1 do if a mod i=0 then s:=s+i; {нашли сумму делителей числа a}
s1:=0;
for b:=1 to s-1 do if s mod b=0 then s1:=s1+b; {нашли сумму делителей для s}
if (s1=a) and (s< >a) and (s>a) then {если эти условия соблюдаются, то числа - дружественные...}
begin
inc (k);
writeln(a:10,s:10);
if s<=999 then {если трехзначные числа кончились, то обнуляем количество дружественных чисел}
begin inc(kol_3zn); k:=0 end;
end;
end;
writeln('Количество пар трехзначных дружественных чисел = ', kol_3zn);
kol_4zn:=k ;
writeln('Количество пар четырехзначных дружественных чисел = ', kol_4zn);
p:= kol_4zn > kol_3zn ;
writeln(p);
end.
|
|
|
|
|
|
|
|
|
|
|
|