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

物联沃分享整理
物联沃-IOTWORD物联网 » P10984:蓝桥杯2023国赛Python A组——解析残缺数字问题

发表回复