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

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

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

Помогите с олимпиадной задачей! Эта программа выводит в ответе нули. Я не могу понять, чего не хватает. Подскажите, что именно и где прописать. Последовательность натуральных чисел от 1 до М упорядочена по возрастанию суммы цифр в десятичном представлении чисел (при одинаковой сумме цифр больший порядковый номер имеет большее число). Для сумма первых 100 элементов упорядоченной последовательности составит … Программа на языке Pascal для реализации данного упорядочения может выглядеть, например, так:
Листинг программы
  1. Program Sort_number;
  2. function Digit(Num:longint;N:integer): integer;
  3. var tmp,i:longint;
  4. begin
  5. tmp:=Num;
  6. for i:=1 to N do tmp:=tmp div 10;
  7. Digit:=tmp mod 10;
  8. end;
  9. function Sum_Digits( Num:integer):integer;
  10. var N_Digits,i,Sum:integer;
  11. begin
  12. if (Num<10)then N_Digits:=1
  13. else
  14. N_Digits:=trunc(ln(Num+0.0)/ln(10.0)+1.01)+1;
  15. Sum:=0;
  16. for i:=0 to N_Digits-1 do
  17. Sum:=Sum+Digit(Num,i);
  18. Sum_digits:=Sum;
  19. end;
  20. var Sequence:array[0..1005]of integer;
  21. Number,Count,i,Imin,tmp,Target,ok,Sum:integer;
  22. begin
  23. val(paramstr(1),Number,ok);
  24. val(paramstr(2),Target,ok);
  25. for Count:=0 to Number do Sequence[Count]:=Count;
  26. for Count:=0 to Number-1 do begin
  27. Imin:=Count;
  28. for i:=Count to Number do
  29. if(Sum_Digits(Sequence[i])<Sum_Digits(Sequence[Imin]))then Imin:=i
  30. else if(Sum_Digits(Sequence[i])=Sum_Digits(Sequence[Imin])) then
  31. if(Sequence[i]<Sequence[Imin]) then Imin:=i;
  32. tmp:=Sequence[Imin];Sequence[Imin]:=Sequence[Count];Sequence[Count]:=tmp;
  33. end;
  34. Sum:=0;
  35. for i:=0 to Target do Sum:=Sum+Sequence[i];
  36. writeln('Sum of first ',Target,'is ',Sum);
  37. readln;
  38. end.
В результате расчетов получим, что сумма первых 100 элементов упорядоченной последовательности из 1000 чисел составит 16430.

Решение задачи: «Найти сумму первых 100 элементов упорядоченной последовательности»

textual
Листинг программы
  1. const mm=1000;
  2. function DigSum(n: Longint): Integer;
  3. begin
  4.   Result:=0;
  5.   while n>0 do begin
  6.     Inc(Result,n mod 10); n:=n div 10;
  7.   end;
  8. end;
  9. procedure Sort(var a: array of Longint; m: Integer);
  10. var
  11.   s: array [0..mm-1] of Integer;
  12.   i, l, r, nn: Longint;
  13.   function Less(j, k: Integer): Boolean;
  14.   begin
  15.     Result:=(s[j]<s[k]) or (s[j]=s[k]) and (a[j]<a[k]);
  16.   end;
  17.   procedure Swap(j, k: Integer);
  18.   var ta: Longint; ts: Integer;
  19.   begin
  20.     nn:=i;
  21.     ta:=a[j]; a[j]:=a[k]; a[k]:=ta;
  22.     ts:=s[j]; s[j]:=s[k]; s[k]:=ts;
  23.   end;
  24. begin
  25.   for i:=0 to m-1 do s[i]:=DigSum(a[i]);
  26.   nn:=0; l:=0; r:=m-1;
  27.   while l<r do begin
  28.     l:=nn; for i:=l to     r-1 do if Less(i+1,i) then Swap(i+1,i);
  29.     r:=nn; for i:=r downto l+1 do if Less(i,i-1) then Swap(i,i-1);
  30.   end;
  31. end;
  32. var
  33.   a: array [1..mm] of Longint;
  34.   m, n, i, s: Longint;
  35. begin
  36.   Read(m,n); for i:=1 to m do a[i]:=i;
  37.   Sort(a,m); for i:=1 to n do Inc(s,a[i]);
  38.   WriteLn(s);
  39. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы