На натуральном отрезке найдите и выведите число N с наибольшей суммой своих делителей - Free Pascal
Формулировка задачи:
На натуральном отрезке [a,b] найдите и выведите число N с наибольшей суммой своих делителей. Само число и единицу в качестве делителей не учитывать. Нужно расписать решение задачи и алгоритм, и убрав массив t1 из кода. И как сразу определить является ли сумма максимальной?
Код
var a,b,i,j,max,poz,ch : longint;
t1,t2 : array [1..1000] of longint;
begin
write('a=');readln(a); //Читаем
write('b=');readln(b); //границы
if a>=b then halt;
j:=0;
for ch:=a to b do //Проверяем числа с промежутка
begin
inc(j);t2[j]:=ch;
for i:=2 to ch-1 do
if ch mod i=0 then t1[j]:=t1[j]+i; //Для каждого числа создаем
end; //элемент в массиве t1
max:=t1[1];poz:=1; //содержащий сумму делителей
for i:=1 to j do
if t1[i]>max then begin max:=t1[i];poz:=i; ////Находим максимум в массиве t1.
end;
writeln('N=',t2[poz]);
write('Наибольшая сумма делителей: ',t1[poz]);
readln;
end.Решение задачи: «На натуральном отрезке найдите и выведите число N с наибольшей суммой своих делителей»
textual
Листинг программы
var a,b,i,j,s,max,imax: longint;
begin
repeat
write('Введите натуральное число a=');
readln(a);
until a>0;
repeat
write('Введите натуральное число,больше ',a,' b=');
readln(b);
until b>a;
max:=0;
for i:=a to b do
begin
s:=0;
for j:=2 to i div 2 do
if i mod j=0 then s:=s+j;
if s>max then
begin
max:=s;
imax:=i
end;
end;
write('Наибольшую сумму делителей=',max,' имеет число ',imax);
readln;
end.
Объяснение кода листинга программы
- Переменные
a,b,i,j,s,max,imaxобъявлены как longint. - Цикл repeat-until используется для ввода значения переменной
a. Пользователю предлагается ввести натуральное число, и цикл продолжается до тех пор, пока это число больше нуля. - Цикл repeat-until используется для ввода значения переменной
b. Пользователю предлагается ввести натуральное число, большее значения переменнойa. - Переменная
maxинициализируется значением 0. - Цикл for выполняется для каждого числа от
aдоb. - Внутри цикла для каждого числа
iсоздается переменнаяs, которая инициализируется значением 0. - Цикл for выполняется для каждого числа от 2 до
idiv 2 (т.е. до половины числаi). - Внутри цикла проверяется, делится ли
iна текущее значениеjбез остатка. Если да, то значениеjдобавляется кs. - Если значение
sбольше текущего значенияmax, то обновляются значенияmaxиimax. - После завершения цикла для каждого числа выводится сообщение, содержащее наибольшую сумму делителей и число, которое ее имеет.
- Программа завершается после нажатия клавиши Enter.