UVA11956题解
题面
题目传送门
(话说这题名真的不会取个文明点的吗)
题目大意:
你的好损友买了一个可以编程的灯,这个灯的程序的代码里面有一个长度为 > 表示将指针往右移一格;< 表示将指针往左移一格;+ 表示把指针指向位置的数加一;- 表示把指针指向位置的数减一;. 表示将指针指向的位置的数读出来。现在给定
思路
这道题属于中级模拟题,适合一些熟练能写出模拟题的人。在题目中并没有说明第五个指令的用途,所以我们可以暂时不管。我们知道,char 类型的范围是 unsigned char 的范围刚好就是 unsigned char 储存每个数,不用判断小于 printf 的 %02X,也就是大写
代码
#include<bits/stdc++.h>
using namespace std;
unsigned char ans[105];//循环数组
int now,T;//指针位置和数据组数
string s;//操作字符串
int main(){
cin>>T;
for(int i=1;i<=T;i++){
memset(ans,0,sizeof(ans));
now=1;
cin>>s;
for(int j=0;j<s.size();j++){//模拟
if(s[j]=='+')
ans[now]++;
if(s[j]=='-')
ans[now]--;
if(s[j]=='>'&&++now>100)//这里用了一个巧妙的方法:如果第一个条件成立,now就会执行加一,再来判断是否大于100,省了很多行
now=1;
if(s[j]=='<'&&--now<1)
now=100;
}
printf("Case %d: ",i);
for(int j=1;j<100;j++)
printf("%02X ",ans[j]);
printf("%02X\n",ans[100]);//UVA输出末尾不能有空格就很离谱
}
return 0;
}