传送门:http://acm.jlu.edu.cn/joj/showproblem.php?pid=2563
一道模拟题,大意就是一个数字可以用八个灯的开关组合出来,八个灯组成了一个二进制数,之后这些二进制数可以转化成3位的十进制数,给你两个数,求和.....
模拟做就行了,先转化成十进制数,之后求和,再转化回去就行了。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int pa[150];
char str[2000], str1[1000], str2[1000], str3[1000];
void init()
{
pa[0]=63;pa[63]=0;
pa[1]=10;pa[10]=1;
pa[2]=93;pa[93]=2;
pa[3]=79;pa[79]=3;
pa[4]=106;pa[106]=4;
pa[5]=103;pa[103]=5;
pa[6]=119;pa[119]=6;
pa[7]=11;pa[11]=7;
pa[8]=127;pa[127]=8;
pa[9]=107;pa[107]=9;
}
int main()
{
int i, j;
init();
while (scanf("%s", str) != EOF)
{
memset(str1, 0, sizeof(str1));
memset(str2, 0, sizeof(str2));
str3[0] = '\0';
if (str[0] == 'B')
break;
int len = strlen(str);
for (i = 0; i < len; ++i)
{
if (str[i] == '+')
{
str1[i] = '\0';
break;
}
str1[i] = str[i];
}
for (j = 0, i++; i < len; i++, j++)
{
if (str[i] == '=')
{
str2[i] = '\0';
break;
}
str2[j] = str[i];
}
len = strlen(str1);
int a, b, c,tmp;
a = b = c = 0;
for (i = 0; i < len; i += 3)
{
tmp = 0;
for (j = i; j < i + 3; ++j)
{
tmp *= 10;
tmp += str1[j] - '0';
}
a *= 10;
a += pa[tmp];
}
len = strlen(str2);
for (i = 0; i < len; i += 3)
{
tmp = 0;
for (j = i; j < i + 3; ++j)
{
tmp *= 10;
tmp += str2[j] - '0';
}
b *= 10;
b += pa[tmp];
}
c = a + b;
int out[20], ot = 0;
while (c)
{
out[ot++] = c % 10;
c = c / 10;
}
printf("%s", str);
for (i = ot - 1; i >= 0; --i)
{
if (pa[out[i]] < 100) printf("0%d", pa[out[i]]);
else
printf("%d", pa[out[i]]);
}
puts("");
}
return 0;
}