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

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

Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
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