Отсортировать массив по возрастанию суммы цифр

Задача

Дан одномерный массив, состоящий из натуральных чисел. Выполнить сортировку данного массива по возрастанию суммы цифр чисел. Например, дан массив чисел [14, 30, 103]. После сортировки он будет таким: [30, 103, 14], так как сумма цифр числа 30 составляет 3, числа 103 равна 4, числа 14 равна 5.

Вывести на экран исходный массив, отсортированный массив, а также для контроля сумму цифр каждого числа отсортированного массива.

Пояснение к задаче и алгоритм решения

Сортировку массива выполним методом пузырька. В данном случае отличие заключается в том, что в заголовке условного оператора нам надо сравнивать не сами числа, а сумму их цифр.

Для подсчета суммы цифр числа напишем функцию, которая будет принимать число, а возвращать сумму его цифр. Данная функция будет вызываться в условном операторе дважды (для очередного и следующего за ним числа).

Алгоритм подсчета суммы цифр числа с использованием цикла "пока" описан здесь.

Поскольку кроме прочего требуется вывести суммы цифр чисел отсортированного массива, то после вывода массива он еще раз перебирается в цикле, и для каждого элемента вызывается функция.

Исходный код на языке программирования Pascal

const
    N = 10;
var
    arr: array[1..N] of integer;
    i, j: byte;
    a: integer;
function sum (n: integer): byte;
    begin
        sum := 0;
        while n > 0 do begin
            sum := sum + n mod 10;
            n := n div 10;
        end;
    end;
begin
    randomize;
    for i := 1 to N do begin
        arr[i] := random(20)+10;
        write (arr[i]:3);
    end;
    writeln;
     
    for i := 1 to N-1 do // количество проходов по массиву
        for j := 1 to N-i do // количество сравнений в каждом проходе
            if sum(arr[j]) > sum(arr[j+1]) then begin
                a := arr[j];
                arr[j] := arr[j+1];
                arr[j+1] := a;
            end;
 
    for i := 1 to N do
        write(arr[i]:3);
    writeln;
    for i := 1 to N do
        write(sum(arr[i]):3);
    writeln;
end.

Пример(ы) выполнения программы на языке Pascal

 16 16 22 26 21 26 15 12 10 14
 10 21 12 22 14 15 16 16 26 26
  1  3  3  4  5  6  7  7  8  8

Исходный код на языке программирования C

#include <stdio.h>
#define N 10
int summ (int);
main() {
    int a[N], i, j, b;
    srand(time(NULL));
    for (i=0; i<N; i++) {
        a[i] = rand()%100;
        printf("%3d", a[i]);
    }
    printf("\n");
 
    for (i=0; i < N-1; i++) {
        for (j=0; j < N-i-1; j++) {
            if (summ(a[j]) > summ(a[j+1])) {
                b = a[j];
                a[j] = a[j+1];
                a[j+1] = b;
            }
        }
    }
 
    for (i=0; i<N; i++)
        printf("%3d", a[i]);
    printf("\n");
    for (i=0; i<N; i++)
        printf("%3d", summ(a[i]));
    printf("\n");
}

int summ (int n) {
    int s = 0;
    while (n > 0) {
        s += n%10;
        n = n/10;
    }
    return s;
}

Пример(ы) выполнения программы на языке C

 87 25 77 77 61 25 13 26 54 79
 13 25 61 25 26 54 77 77 87 79
  4  7  7  7  8  9 14 14 15 16

Исходный код на языке программирования Python

def summ (m):
    s = 0
    while m > 0:
        s += m%10
        m = m//10
    return s

from random import random
N = 10
a = [0]*N
for i in range(N):
    a[i] = int(random()*40) + 10
    print('%4d' % a[i], end='')
print()
 
for i in range(N-1): # количество переборов 9
    for j in range(N-i-1): # при первом переборе i=0
        if summ(a[j]) > summ(a[j+1]):
            a[j], a[j+1] = a[j+1], a[j]

for i in range(N):
    print('%4d' % a[i], end='')
print()

for i in range(N):
    print('%4d' % summ(a[i]), end='')
print()

Пример(ы) выполнения программы на языке Python

  21  25  17  28  24  16  11  23  31  30
  11  21  30  31  23  24  25  16  17  28
   2   3   3   4   5   6   7   7   8  10

Исходный код на языке программирования КуМир

алг сортировка пузырьком
нач
  цел N = 10
  цел таб arr[1:N]
  цел i,j,k
  нц для i от 1 до N
    arr[i] := int(rand(0,100))
    вывод arr[i]:3
  кц
  вывод нс
  нц для i от 1 до N-1
    нц для j от 1 до N-i
      если summ(arr[j]) > summ(arr[j+1]) то
        k := arr[j]
        arr[j] := arr[j+1]
        arr[j+1] := k
      все
    кц
  кц

  нц для i от 1 до N
    вывод arr[i]:3
  кц
  вывод нс
  нц для i от 1 до N
    вывод summ(arr[i]):3
  кц
кон

алг цел summ(цел n)
нач
  цел m
  знач := 0
  m := n
  нц пока m > 0
    знач := знач + mod(m,10)
    m := div(m,10)
  кц
кон

Пример(ы) выполнения программы на языке КуМир

 59 82  6 40 87 10 88 17  7 89
 10 40  6  7 17 82 59 87 88 89
  1  4  6  7  8 10 14 15 16 17

Тема

Функции

Уровень сложности

Сложный

Дата публикации