Description
给定一个由互不相等的非负整数组成的数组A[N],将其按照如下规则排序:
1. 对于0<=i<j<N,A[i]的各位数字之和不大于A[j]的各位数字之和。
2. 对于0<=i<j<N,如果A[i]的各位数字之和等于A[j]的各位数字之和,则要求A[i]<A[j]。
Input
输入有多行。
第1行M>0,表示之后有M组输入。
每组输入占一行。每行的第一个整数0<N<11,表示之后有N个非负整数,这些整数两两不等。
Output
每组输入的排序结果对应一行输出,两两之间用1个空格隔开。
Sample Input
3 10 100 10 1 22 31 4 109 87 18 1999 5 50 14 41 23 32 7 7 6 5 4 3 2 1
Sample Output
1 10 100 4 22 31 18 109 87 1999 14 23 32 41 50 1 2 3 4 5 6 7
题解
#include <stdio.h>
#include <stdlib.h>
// 计算数字的各位数字之和
int digitSum(int num) {
int sum = 0;
while (num > 0) {
sum += num % 10;
num /= 10;
}
return sum;
}
// 比较函数,用于排序
int compare(const void *a, const void *b) {
int sumA = digitSum(*(int *)a);
int sumB = digitSum(*(int *)b);
if (sumA != sumB) {
return sumA - sumB;
} else {
return (*(int *)a - *(int *)b);
}
}
int main() {
int M;
scanf("%d", &M);
while (M--) {
int N;
scanf("%d", &N);
int *arr = (int *)malloc(N * sizeof(int));
for (int i = 0; i < N; i++) {
scanf("%d", &arr[i]);
}
// 使用qsort进行排序,使用compare函数进行比较
qsort(arr, N, sizeof(int), compare);
// 输出排序后的结果
for (int i = 0; i < N; i++) {
printf("%d", arr[i]);
if (i < N - 1) {
printf(" ");
}
}
printf("\n");
free(arr);
}
return 0;
}