洛谷题解: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,输出答案即可。
结束

浙公网安备 33010602011771号