三尺非寒 发表于 2025-5-9 13:50:20

P10984 [蓝桥杯 2023 国 Python A] 残缺的数字

标题描述

七段码表现器是一种常见的表现数字的电子元件,它有七个发光管组成:

https://i-blog.csdnimg.cn/img_convert/8becea77d5d0bd0f9aa5fb11387f5ea6.png
上图依次展示了数字 0∼9 用七段码来表现的状态,其中灯管为黄色表现点亮,灰色表现熄灭。根据灯管的亮暗状态,我们可以用一个状态码(状态码是一个 7 位的二进制数字)来表现一个七段码,令灯管点亮时状态为 1,灯管熄灭时状态为 0,按照灯管 ABCDEFG 的顺序标识一个七段码,则数字 0∼9 的状态码为:
数字状态码数字状态码01111110510110111011000061011111211011017111000031111001811111114011001191111011 小蓝有一个喜好的数字,长度为 18 位,每一位用一个七段码表现器来展示 (每位只能是 0∼9,可以包含前导零),由于灯管故障,一些本该点亮的灯管 处于了熄灭状态。比方,对于一个长度为 2 的数字来说,当两个七段码对应的 状态码分别为:1011111(高位)、1110011(低位)时,原本的数字可能会是: 68、69、88、89,有 4 种可能的值。
18 个七段码表现器对应的状态码分别为:
0000011,1001011,0000001,0100001,0101011,0110110, 1111111,0010110, 0101001,0010110, 1011100,0100110, 1010000,0010011, 0001111,0101101, 0110101,1101010。
其中每个表现一个七段码对应的的状态码(按照数字的高位到低位给出)。请你 判断下小蓝喜好的数字有多少种可能的值。
输入格式


输特别式

一行一个整数表现答案。
输入输出样例



看完大佬们的题解,我已经悟了,本身写了一遍代码,讲一下本身的理解。

18个码(我简称为爱码吧),每个码都或多或少有残缺,标题给出灯管有可能原来是点亮状态,但熄灭了,所以我们拿18个码一次次和0~9这10个数字的码比力,看看可能是这几个数字的哪几种。怎么看呢?写一个循环,从0~7,遍历这些码的每一个二进制数字,拿爱码依次和0~9这10个数字码比力,假如这个时间爱码是1而数字的码是0,那这个爱码就不可能是这个数字。

接下来看代码:
https://i-blog.csdnimg.cn/direct/8855f799c46b4504bdf4ef4502e93757.png
先存储爱码和这10个数字的码
https://i-blog.csdnimg.cn/direct/ed551c0fe8ed4dedbc8caec89f73b9f1.png
写一个18次的循环,表现每个爱码,t担当check的返回值,check返回的是这个爱码可能是0~9这十个数字码中的哪几种,根据乘法原则,18个码,每个码有x种可能,那一共就是这18个码每种可能的乘积。所以写上ans *= t,留意ans要从1开始。

https://i-blog.csdnimg.cn/direct/7f863adba8b344b697d07f8c25dc0295.png
外层循环是遍历0~9这10个数字一遍,内层则是每个数字的8个二进制数字,内里要做判断比力,就像判断质数一样,管你是不符合要求直接break,到时间观察k这个数字有没有走完来判断是否合法,照旧在break之前插一个flag,通过这个flag的值变化判断是否合法,反正只要能证实合法性就行,最后返回cnt(每个爱码有几种可能)就行。
源码如下:
#include <bits/stdc++.h>

using namespace std;

string aima = {"0000011", "1001011", "0000001", "0100001", "0101011",
                                "0110110", "1111111", "0010110", "0101001", "0010110" ,
                                "1011100", "0100110", "1010000", "0010011", "0001111",
                                "0101101", "0110101", "1101010"};
                               
string figure[] = {"1111110", "0110000", "1101101", "1111001", "0110011",
                                        "1011011", "1011111", "1110000", "1111111", "1111011"};
                                       

int check(int i)
{
        int cnt = 0;
        for (int j = 0; j <= 9; j++) //10个数字
        {
                int k = 0;
                for (k = 0; k <= 7; k++) {//8个二进制数字
                        if (figure == '0' && aima == '1') break;
                }
                if (k == 8) cnt++;
        }
        return cnt;
}

               
int main()
{
        int ans = 1;
        int t = 0;
        for (int i = 0; i < 18; i++)
        {
                t = check(i);
                ans *= t;
        }
        cout << ans << endl;
        return 0;
}
https://i-blog.csdnimg.cn/direct/de250e3c969441dea71a117508256fba.png
最后的效果是这个,填空题直接输出这个数字就行了

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: P10984 [蓝桥杯 2023 国 Python A] 残缺的数字