Дан одномерный массив, состоящий из натуральных чисел. Выполнить сортировку данного массива по возрастанию суммы цифр чисел. Например, дан массив чисел [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.
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
Язык Си
#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;
}
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()
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