P10984:蓝桥杯2023国赛Python A组——解析残缺数字问题
题目描述
七段码显示器是一种常见的显示数字的电子元件,它有七个发光管组成:
上图依次展示了数字 0∼9 用七段码来显示的状态,其中灯管为黄色表示点亮,灰色表示熄灭。根据灯管的亮暗状态,我们可以用一个状态码(状态码是一个 7 位的二进制数字)来表示一个七段码,令灯管点亮时状态为 1,灯管熄灭时状态为 0,按照灯管 ABCDEFG 的顺序标识一个七段码,则数字 0∼9 的状态码为:
数字 | 状态码 | 数字 | 状态码 |
---|---|---|---|
0 | 1111110 | 5 | 1011011 |
1 | 0110000 | 6 | 1011111 |
2 | 1101101 | 7 | 1110000 |
3 | 1111001 | 8 | 1111111 |
4 | 0110011 | 9 | 1111011 |
小蓝有一个喜爱的数字,长度为 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,那这个爱码就不可能是这个数字。
接下来看代码:
先存储爱码和这10个数字的码
写一个18次的循环,表示每个爱码,t接受check的返回值,check返回的是这个爱码可能是0~9这十个数字码中的哪几种,根据乘法原则,18个码,每个码有x种可能,那一共就是这18个码每种可能的乘积。所以写上ans *= t,注意ans要从1开始。
外层循环是遍历0~9这10个数字一遍,内层则是每个数字的8个二进制数字,里面要做判断比较,就像判断质数一样,管你是不符合要求直接break,到时候观察k这个数字有没有走完来判断是否合法,还是在break之前插一个flag,通过这个flag的值变化判断是否合法,反正只要能证明合法性就行,最后返回cnt(每个爱码有几种可能)就行。
源码如下:
#include <bits/stdc++.h>
using namespace std;
string aima[18] = {"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[j][k] == '0' && aima[i][k] == '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;
}
最后的结果是这个,填空题直接输出这个数字就行了
作者:ElysiaIWTB