Найти сумму первых 100 элементов упорядоченной последовательности - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Помогите с олимпиадной задачей! Эта программа выводит в ответе нули. Я не могу понять, чего не хватает. Подскажите, что именно и где прописать. Последовательность натуральных чисел от 1 до М упорядочена по возрастанию суммы цифр в десятичном представлении чисел (при одинаковой сумме цифр больший порядковый номер имеет большее число). Для сумма первых 100 элементов упорядоченной последовательности составит … Программа на языке Pascal для реализации данного упорядочения может выглядеть, например, так:
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 элементов упорядоченной последовательности из 1000 чисел составит 16430.

Решение задачи: «Найти сумму первых 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.

Объяснение кода листинга программы

  1. В функции DigSum(n: Longint): Integer; происходит вычисление суммы цифр числа n.
  2. В процедуре Sort(var a: array of Longint; m: Integer); происходит сортировка массива a по возрастанию.
  3. В функции Less(j, k: Integer): Boolean; определяется условие для сравнения элементов массива a.
  4. В процедуре Swap(j, k: Integer); происходит обмен элементов a[j] и a[k], а также соответствующих им элементов массива s.
  5. В основной части программы считываются значения m и n, заполняется массив a значениями от 1 до m, затем вызывается процедура Sort для сортировки массива a.
  6. Далее суммируются элементы отсортированного массива a с помощью цикла for i:=1 to n do Inc(s,a[i]);
  7. И наконец, выводится на экран значение переменной s.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.8 из 5
Похожие ответы