问题描述
在蓝桥王国,数字的大小不仅仅取决于它们的数值大小,还取决于它们所形成的“封闭图形”的个数。
封闭图形是指数字中完全封闭的空间,例如数字 1、2、3、5、7 都没有形成封闭图形,而数字 0、4、6、9 分别形成了 1 个封闭图形,数字 8 则形成了 2 个封闭图形。值得注意的是,封闭图形的个数是可以累加的。例如,对于数字 68,由于 6 形成了 1 个封闭图形,而 8 形成了 2 个,所以 68 形成的封闭图形的个数总共为 3。
在比较两个数的大小时,如果它们的封闭图形个数不同,那么封闭图形个数较多的数更大。例如,数字 41 和数字 18,它们对应的封闭图形的个数分别为 1 和 2,因此数字 41 小于数字 18。如果两个数的封闭图形个数相同,那么数值较大的数更大。例如,数字 14 和数字 41,它们的封闭图形的个数都是 1,但 14<41,所以数字 14 小于数字 41。 如果两个数字的封闭图形个数和数值都相同,那么这两个数字被认为是相等的。
小蓝对蓝桥王国的数字大小规则十分感兴趣。现在,他将给定你 n 个数 a1,a2,…,an,请你按照蓝桥王国的数字大小规则,将这 n 数从小到大排序,并输出排序后结果。
输入格式
第一行包含一个整数 n,表示给定的数字个数。
第二行包含 n个整数 a1,a2,…,an,表示待排序的数字。
输出格式
输出一行,包含 n 个整数,表示按照蓝桥王国的数字大小规则从小到大排序后的结果,每两个数字之间用一个空格分隔。
样例输入
3
18 29 6
样例输出
6 29 18
样例说明
对于给定的数字序列 [18,29,6],数字 18的封闭图形个数为 2,数字 29 的封闭图形个数为 1,数字 6 的封闭图形个数为 1。按照封闭图形个数从小到大排序后,得到 [29,6,18]。
由于数字 29 和数字 6的封闭图形个数相同,因此需要进一步按照数值大小对它们进行排序,最终得到 [6,29,18]。
评测用例规模与约定
对于 50%的评测用例,1≤n≤2×103,1≤ai≤105。
对于所有评测用例,1≤n≤2×105,1≤ai≤109。
解答代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int num;
int closed;
} Number;
int getClosedCount(int num) {
int count = 0;
int digit;
while (num > 0) {
digit = num % 10;
switch (digit) {
case 0: case 4: case 6: case 9:
count += 1;
break;
case 8:
count += 2;
break;
default:
break;
}
num /= 10;
}
return count;
}
int compare(const void *a, const void *b) {
Number *numA = (Number *)a;
Number *numB = (Number *)b;
if (numA->closed != numB->closed) {
return numA->closed - numB->closed;
} else {
return numA->num - numB->num;
}
}
int main() {
int n;
scanf("%d", &n);
Number *numbers = (Number *)malloc(n * sizeof(Number));
for (int i = 0; i < n; i++) {
scanf("%d", &numbers[i].num);
numbers[i].closed = getClosedCount(numbers[i].num);
}
qsort(numbers, n, sizeof(Number), compare);
for (int i = 0; i < n; i++) {
printf("%d", numbers[i].num);
if (i < n - 1) {
printf(" ");
}
}
printf("\n");
free(numbers);
return 0;
}
-
结构体定义:
Number
结构体包含两个字段,num
存储原始数字,closed
存储该数字的封闭图形数。 -
封闭图形数计算:
getClosedCount
函数分解数字的每一位,根据规则统计封闭图形数。例如,数字8贡献2个,0、4、6、9各贡献1个。 -
比较函数:
compare
函数用于qsort
,优先比较封闭图形数,若相同则比较数值大小。 -
主函数:读取输入数据,计算每个数字的封闭图形数,使用
qsort
进行排序,最后输出结果。
测试通过率为100%