【蓝桥杯竞赛题】0封闭图形个数

问题描述

在蓝桥王国,数字的大小不仅仅取决于它们的数值大小,还取决于它们所形成的“封闭图形”的个数。

封闭图形是指数字中完全封闭的空间,例如数字 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;
}
  1. 结构体定义Number结构体包含两个字段,num存储原始数字,closed存储该数字的封闭图形数。

  2. 封闭图形数计算getClosedCount函数分解数字的每一位,根据规则统计封闭图形数。例如,数字8贡献2个,0、4、6、9各贡献1个。

  3. 比较函数compare函数用于qsort,优先比较封闭图形数,若相同则比较数值大小。

  4. 主函数:读取输入数据,计算每个数字的封闭图形数,使用qsort进行排序,最后输出结果。

测试通过率为100%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值