Найти сумму первых 100 элементов упорядоченной последовательности - Free Pascal
Формулировка задачи:
Помогите с олимпиадной задачей! Эта программа выводит в ответе нули. Я не могу понять, чего не хватает. Подскажите, что именно и где прописать.
Последовательность натуральных чисел от 1 до М упорядочена по возрастанию суммы цифр в десятичном представлении чисел (при одинаковой сумме цифр больший порядковый номер имеет большее число).
Для сумма первых 100 элементов упорядоченной последовательности составит …
Программа на языке Pascal для реализации данного упорядочения может выглядеть, например, так:
В результате расчетов получим, что сумма первых 100 элементов упорядоченной последовательности из 1000 чисел составит 16430.
Листинг программы
- Program Sort_number;
- function Digit(Num:longint;N:integer): integer;
- var tmp,i:longint;
- begin
- tmp:=Num;
- for i:=1 to N do tmp:=tmp div 10;
- Digit:=tmp mod 10;
- end;
- function Sum_Digits( Num:integer):integer;
- var N_Digits,i,Sum:integer;
- begin
- if (Num<10)then N_Digits:=1
- else
- N_Digits:=trunc(ln(Num+0.0)/ln(10.0)+1.01)+1;
- Sum:=0;
- for i:=0 to N_Digits-1 do
- Sum:=Sum+Digit(Num,i);
- Sum_digits:=Sum;
- end;
- var Sequence:array[0..1005]of integer;
- Number,Count,i,Imin,tmp,Target,ok,Sum:integer;
- begin
- val(paramstr(1),Number,ok);
- val(paramstr(2),Target,ok);
- for Count:=0 to Number do Sequence[Count]:=Count;
- for Count:=0 to Number-1 do begin
- Imin:=Count;
- for i:=Count to Number do
- if(Sum_Digits(Sequence[i])<Sum_Digits(Sequence[Imin]))then Imin:=i
- else if(Sum_Digits(Sequence[i])=Sum_Digits(Sequence[Imin])) then
- if(Sequence[i]<Sequence[Imin]) then Imin:=i;
- tmp:=Sequence[Imin];Sequence[Imin]:=Sequence[Count];Sequence[Count]:=tmp;
- end;
- Sum:=0;
- for i:=0 to Target do Sum:=Sum+Sequence[i];
- writeln('Sum of first ',Target,'is ',Sum);
- readln;
- end.
Решение задачи: «Найти сумму первых 100 элементов упорядоченной последовательности»
textual
Листинг программы
- const mm=1000;
- function DigSum(n: Longint): Integer;
- begin
- Result:=0;
- while n>0 do begin
- Inc(Result,n mod 10); n:=n div 10;
- end;
- end;
- procedure Sort(var a: array of Longint; m: Integer);
- var
- s: array [0..mm-1] of Integer;
- i, l, r, nn: Longint;
- function Less(j, k: Integer): Boolean;
- begin
- Result:=(s[j]<s[k]) or (s[j]=s[k]) and (a[j]<a[k]);
- end;
- procedure Swap(j, k: Integer);
- var ta: Longint; ts: Integer;
- begin
- nn:=i;
- ta:=a[j]; a[j]:=a[k]; a[k]:=ta;
- ts:=s[j]; s[j]:=s[k]; s[k]:=ts;
- end;
- begin
- for i:=0 to m-1 do s[i]:=DigSum(a[i]);
- nn:=0; l:=0; r:=m-1;
- while l<r do begin
- l:=nn; for i:=l to r-1 do if Less(i+1,i) then Swap(i+1,i);
- r:=nn; for i:=r downto l+1 do if Less(i,i-1) then Swap(i,i-1);
- end;
- end;
- var
- a: array [1..mm] of Longint;
- m, n, i, s: Longint;
- begin
- Read(m,n); for i:=1 to m do a[i]:=i;
- Sort(a,m); for i:=1 to n do Inc(s,a[i]);
- WriteLn(s);
- end.
Объяснение кода листинга программы
- В функции DigSum(n: Longint): Integer; происходит вычисление суммы цифр числа n.
- В процедуре Sort(var a: array of Longint; m: Integer); происходит сортировка массива a по возрастанию.
- В функции Less(j, k: Integer): Boolean; определяется условие для сравнения элементов массива a.
- В процедуре Swap(j, k: Integer); происходит обмен элементов a[j] и a[k], а также соответствующих им элементов массива s.
- В основной части программы считываются значения m и n, заполняется массив a значениями от 1 до m, затем вызывается процедура Sort для сортировки массива a.
- Далее суммируются элементы отсортированного массива a с помощью цикла for i:=1 to n do Inc(s,a[i]);
- И наконец, выводится на экран значение переменной s.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д