输入int类型范围内的N个非负整数,要求按各个整数的各数位上数字的平方和从小到大排序,若平方和相等则按数值从小到大排序。 例如,三个整数9、31、13各数位上数字的平方和分别为81、10、10,则排序结果为13、31、9。 输入格式: 测试数据有多组。每组数据先输入一个整数N(0<N<100),然后输入N个非负整数。若N=0,则表示输入结束。 输出格式: 对于每组测试,在一行上输出按要求排序后的结果,数据之间留一个空格。
以下是C语言的实现代码:
#include <stdio.h>
#include <stdlib.h>
// 返回一个整数的各数位上数字的平方和
int sum_of_square(int n) {
int sum = 0;
while (n > 0) {
int digit = n % 10;
sum += digit * digit;
n /= 10;
}
return sum;
}
// 比较两个整数的各数位上数字的平方和以及数值大小
int cmp(const void *a, const void *b) {
int t1 = sum_of_square(*(int *)a);
int t2 = sum_of_square(*(int *)b);
if (t1 != t2) {
return t1 - t2;
} else {
return *(int *)a - *(int *)b;
}
}
int main() {
int n;
int a[100];
while (scanf("%d", &n) == 1 && n != 0) {
int i;
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
qsort(a, n, sizeof(int), cmp);
for (i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
return 0;
}
具体思路如下:
- 读入一个整数N和N个非负整数。
- 编写函数sum_of_square,返回一个整数的各数位上数字的平方和。
- 编写比较函数cmp,比较两个整数的各数位上数字的平方和以及数值大小。
- 调用C标准库的qsort函数,按照cmp函数规定的顺序排序输入的整数。
- 输出排序后的结果。
例如,对于输入数据3 9 31 13,程序将会输出“13 31 9”。