Найти число от 1 до n с максимальной суммой делителей - PascalABC.NET
Формулировка задачи:
Должно работать для n<=1 000 000
Вот мой код и я не знаю где ошибка...
Листинг программы
- Program b;
- Var
- n,i,j,max,maxn:Integer;
- a:Array[1..1000000] Of Integer;
- BEGIN
- Readln(n);
- j:=1;
- For i:=1 To n Do
- a[i]:=1;
- For i:=2 To n Do
- Begin
- j:=i;
- While j<=n Do
- Begin
- a[j]:=a[j]+i;
- j:=j+i;
- End;
- End;
- max:=a[1];
- maxn:=1;
- For i:=1 To n Do
- If (a[i]>max) Then
- Begin
- max:=a[i];
- maxn:=i;
- End;
- Writeln(maxn);
- END.
Решение задачи: «Найти число от 1 до n с максимальной суммой делителей»
textual
Листинг программы
- Program b;
- var n,i,j,k,max,maxn:Integer;
- begin
- readln(n);
- max:=1;
- maxn:=1;
- for i:=2 To n Do
- begin
- k:=2;//1 и само
- for j:=2 to trunc(sqrt(i)) do//считаем делители до корня из числа и умножаем на 2
- if i mod j=0 then inc(k,2);
- if frac(sqrt(i))=0 then dec(k);//если число полный квадрат, то минус 1
- if k>max then
- begin
- max:=k;
- maxn:=i;
- end;
- end;
- write(maxn);
- end.
Объяснение кода листинга программы
- Объявлены переменные: n, i, j, k, max, maxn (10).
- С помощью функции readln(n) вводится число n (11).
- Переменная max инициализируется значением 1 (12).
- Переменная maxn инициализируется значением 1 (13).
- Два вложенных цикла for начинаются. Первый цикл проходит по числам от 2 до n (14).
- Внутри первого цикла начинается второй цикл for который считает делители числа i до его корня (15).
- Если число i делится на j без остатка, то к переменной k прибавляется 2 (16).
- Если число i является полным квадратом (то есть его корень извлекается без остатка), то переменная k уменьшается на 1 (17).
- Если переменная k больше max, то максимальное значение присваивается переменной max, а переменная maxn получает значение i (18).
- По завершению вложенных циклов, число maxn выводится на экран (19).
- Конец программы (20).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д