题目6:数字排序
问题描述
给定n个整数,请计算每个整数各位数字和,按各位数字和从大到小的顺序输出。
输入格式
输入的第一行包含一个整数n,表示给定数字的个数。
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
输出多行,每行包含两个整数,分别表示一个给定的整数和它的各位数字和。按各位数字和递减的顺序输出。如果两个整数各位数字和相同,则先输出值较小的,然后输出值较大的。
样例输入
5
101 100 999 1234 110
样例输出
999 27
1234 10
101 2
110 2
100 1
评测用例规模与约定
1 ≤ n ≤ 1000,给出的数都是不超过10000的非负整数。
#include <stdio.h>
struct ss {
int data, num;//data是数据,num是各位的和
} a[10001];
int add(int x) {
//计算各位的加和
int pos = 0;
while (x != 0) {
pos += x % 10;
x = x / 10;
}
return pos;
}
int main() {
int n;
scanf("%d", &n);
for (register int i = 1; i <= n; i++) {
scanf("%d", &a[i].data);
a[i].num = add(a[i].data);
}
//冒泡排序按照原本数据大小排序
for (register int i = 1; i <= n; i++) {
for (register int j = 1; j <= (n - i); j++) {
if (a[j].data > a[j + 1].data) {
int t, tt;
t = a[j].num;
a[j].num = a[j + 1].num;
a[j + 1].num = t;
tt = a[j].data;
a[j].data = a[j + 1].data;
a[j + 1].data = tt;
}
}
}
//冒泡排序按照各位数字加和大小排序
for (register int i = 1; i <= n; i++) {
for (register int j = 1; j <= (n - i); j++) {
if (a[j].num < a[j + 1].num) {
int t, tt;
t = a[j].num;
a[j].num = a[j + 1].num;
a[j + 1].num = t;
tt = a[j].data;
a[j].data = a[j + 1].data;
a[j + 1].data = tt;
}
}
}
//第一次时的错误想法,仅可以处理最多有两个数相同时的情况
/*int k = a[1].num, kk = a[1].data;
for (register int i = 2; i <= (n + 1); i++) {
if (a[i].num == k) {
if (a[i].data > kk) {
printf("%d %d\n", a[i - 1].data, a[i - 1].num);
k=a[i].num;
kk=a[i].data;
} else {
int t, tt;
t = a[i].num;
a[i].num = a[i - 1].num;
a[i - 1].num = t;
tt = a[i].data;
a[i].data = a[i - 1].data;
a[i - 1].data = tt;
printf("%d %d\n", a[i - 1].data, a[i - 1].num);
k=a[i].num;
kk=a[i].data;
}
} else {
printf("%d %d\n", a[i - 1].data, a[i - 1].num);
}
k = a[i].num;
kk = a[i].data;
}*/
for (register int i = 1; i <= n; i++) {
printf("%d %d\n", a[i].data, a[i].num);//输出
}
return 0;
}