W
e
l
c
o
m
e
: )

洛谷题解:P10984 [蓝桥杯 2023 国 Python A] 残缺的数字

题目传送门

一、存入代表 \(0 \sim 9\) 的七段码

按位存储,这里打表即可。

int a[105][105]={
{0,1,1,1,1,1,1,0},    //0
{0,0,1,1,0,0,0,0},    //1
{0,1,1,0,1,1,0,1},    //2
{0,1,1,1,1,0,0,1},    //3
{0,0,1,1,0,0,1,1},    //4
{0,1,0,1,1,0,1,1},    //5
{0,1,0,1,1,1,1,1},    //6
{0,1,1,1,0,0,0,0},    //7
{0,1,1,1,1,1,1,1},    //8
{0,1,1,1,1,0,1,1}     //9
                      //注意数组下标从0开始
};

二、读入

按位读入,存在一个数组里。

for(int j=1;j<=7;j++)
  scanf("%1d",&b[j]);

scanf("%1d",&b[j]);代表每次读入一个字符,存在b[j]中。

三、求每一位的可能性

我们读入一串七段码后之后,将它与代表 \(0 \sim 9\) 的七段码进行比较,如果读入的七段码的第 \(k\) 位为 \(1\),但代表 \(x\) 的七段码的第 \(k\) 位为 \(0\),那么读入的七段码就不可能是 \(x\),反之则有可能。因为我们可以将读入的七段码中的 \(0\) 改为 \(1\),但是不能将 \(1\) 改成 \(0\)

long long check(){
  //b是读入的七段码,a是0到9的七段码
	long long ans=0;
	for(int i=0;i<=9;i++){    //注意从0开始
		int flag=1;
		for(int j=1;j<=7&&flag;j++){
			if(b[j]==1&&a[i][j]==0)flag=0;    //如果该数已经不可能了就退出
		}	
		if(flag)ans++;    //可能答案加一
	}
	return ans;
}

四、写代码

#include<bits/stdc++.h>
using namespace std;
int a[105][105]={
{0,1,1,1,1,1,1,0},
{0,0,1,1,0,0,0,0},
{0,1,1,0,1,1,0,1},
{0,1,1,1,1,0,0,1},
{0,0,1,1,0,0,1,1},
{0,1,0,1,1,0,1,1},
{0,1,0,1,1,1,1,1},
{0,1,1,1,0,0,0,0},
{0,1,1,1,1,1,1,1},
{0,1,1,1,1,0,1,1}
};
int b[105];
long long check(){
	long long ans=0;
	for(int i=0;i<=9;i++){
		int flag=1;
		for(int j=1;j<=7&&flag;j++){
			if(b[j]==1&&a[i][j]==0)flag=0;
		}	
		if(flag)ans++;
	}
	return ans;
}
int main(){
	int n;
	long long ansnum=1;     //long long不开也可以
	cin>>n;     //n代表读入多少个七段码
	for(int i=1;i<=n;i++){
		for(int j=1;j<=7;j++)
			scanf("%1d",&b[j]);
		ansnum*=check();   //边读边算
	}	
	cout<<ansnum<<endl;
	return 0;
}

五、最后一步

题目让我们算这个样例的结果,带到程序里就可以了。

18
0000011
1001011
0000001
0100001
0101011
0110110
1111111
0010110
0101001
0010110
1011100
0100110
1010000
0010011
0001111
0101101
0110101
1101010

得答案 254016000,输出答案即可。


结束

posted @ 2024-08-27 19:15  YYM_CAFE  阅读(108)  评论(0)    收藏  举报