BCD码是指用四位二进制数来表示十进制数中的0~9这十个数字的编码形式,常见的是8421码表如下:
十进制 二进制
0 |
0000 |
1 |
0001 |
2 |
0010 |
3 |
0011 |
4 |
0100 |
5 |
0101 |
6 |
0110 |
7 |
0111 |
8 |
1000 |
9 |
1001 |
现在我们用BCD码表示一个时钟.时钟由13个LED灯组成(见图), 灯1和2表示小时的第一个数字,灯3-6表示小时的第二个数字.灯7-9表示分钟的第一个数字,灯10-13表示分钟的第二个数字.注意,小时的第一个数字和分钟的第一个数字并没有用足四位二进制是因为已经足够表达相关信息了,详见样例.
时钟是24小时制的,规定从00:00到24:00, 24:00和0:00均为正确时刻.
例如: 灯1,3,7,10和12亮表示时刻11:15, 因为灯1亮表示小时的第一个数字是1,灯3亮表示小时的第二个数字也是1.灯7亮表示分钟的第一个数字是1,灯10和12亮表示分钟的第二个数字是1+4=5.
我们问题是,给定时钟的BCD时刻, 求出对应的十进制时刻.
由多组测试数据组成.每组数据一行,包括一个0和1组成的,长度为13的字符串,从左至右对应灯1-13. 1表示灯亮,0表示灯熄灭.
每组测试数据输出一行.如果数据有误,输出"Error", 否则输出对应时刻.见样例.
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define lx( c ) ((c)-(‘0‘))
char ch[25];
void tran(int &a, int &b, int &c, int &d){
a = lx(ch[0]) + lx(ch[1])*2;
b = lx(ch[2]) + lx(ch[3])*2 + lx(ch[4])*4 + lx(ch[5])*8;
c = lx(ch[6]) + lx(ch[7])*2 + lx(ch[8])*4;
d = lx(ch[9]) + lx(ch[10])*2 + lx(ch[11])*4 + lx(ch[12])*8;
}
void Solve_question(){
int a, b, c, d;
tran(a, b, c, d);
bool flag = true;
if(a*10 + b > 24 || c * 10 + d > 59) flag = false;
if(a > 3 || b > 9 || c > 5 || d > 9) flag = false;
if(a*10 + b == 24 && c*10 + d > 0) flag = false;
if( !flag ) printf("Error\n");
else printf("%d%d:%d%d\n", a, b, c, d);
}
int main(){
while(scanf("%s", ch) == 1){
int len = strlen(ch);
if(len != 13) { printf("Error\n"); continue; }
Solve_question();
}
}