湖南大学21夏训练三11.数码管(位运算)

该博客介绍了一个程序设计问题,涉及液晶数码管上数字的表示。程序需要判断输入的一组数字排列是否满足相邻数字可以通过增加或减少笔画数互相转换,但不能同时增加和减少。通过自定义函数转化数字为01字符串并进行位运算判断,最后输出YES或NO。示例输入和输出展示了判断过程。
摘要由CSDN通过智能技术生成

【问题描述】

液晶数码管用七笔阿拉数字表示的十个数字,把横和竖的一 个短划都称为一笔,即7有3笔,8有7笔等。对于十个数字一种排列,要做到两相邻数字都可以由另一个数字加上几笔或减去几笔组成,但不能又加又减。比如 7→3是允许的,7→2不允许。任意输入一组数,判断是否符合上述规则,注意,1在右边。

【输入形式】

每行输入一个0~9的排列,数字之间用空格分隔,以-1作为输入结束

【输出形式】

输出YES或NO

【样例输入】

4 1 0 7 3 9 5 6 8 2
3 5 1 6 2 7 9 0 4 8
-1
【样例输出】

YES
NO

【解题思路】
1.首先,液晶数码管上的数字就是LED等显示的数字
在这里插入图片描述

2.由于系统自带的位运算符不能解决这么长的数的运算,于是我自己写函数来解决这个问题。
3.trans1将输入的数字转化为长度为7位的01字符串来表示各个数字;trans2来实现&位运算的操作
4.如果两个01串位运算之后的结果和其中一串相等,则符合题意;

#include<iostream>
#include<string>
using namespace std;
string trans1(int temp){
	string res;
	if(temp==0)
	res="1110111";
	else if(temp==1)
	res="0010010";
	else if(temp==2)
	res="1011101";
	else if(temp==3)
	res="1011011";
	else if(temp==4)
	res="0111010";
	else if(temp==5)
	res="1101011";
	else if(temp==6)
	res="1101111";
	else if(temp==7)
	res="1010010";
	else if(temp==8)
	res="1111111";
	else if(temp==9)
	res="1111011";
	return res;
}
string trans2(string str1,string str2){
	string res="0000000";
	for(int i=0;i<10;i++){
	if(str1[i]=='1'&&str2[i]=='1')
	res[i]='1';
	else 
	res[i]='0';
	} 
	return res; 
}
int main(){
while(1){
	int a[10];
	for(int i=0;i<10;i++)
{
	cin>>a[i];
	if(a[0]==-1)
	break;
}
	if(a[0]==-1)
	break;
	string str[10];
	for(int i=0;i<10;i++)
	str[i]=trans1(a[i]);
	int count=0;
	for(int i=0;i<9;i++){
		string temp=trans2(str[i],str[i+1]);
		if(temp==str[i]||temp==str[i+1])
		count++;
	}
	if(count==9)
	cout<<"YES"<<endl;
	else 
	cout<<"NO"<<endl;

}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值