2104 二进制
这不就是一个很简单的模拟吗
按照题目进行模拟,然后处理进位啊
这个题我感觉挺简单的
不配做黄题
‘*2’:在二进制中,乘以2就相当于十进制中的乘以十,只需要将数字右移一位即可,因为我们用字符串来存储直接在字符串格式存储的二进制数字末尾加零即可
‘/2’:除以二就是乘以二的逆运算,乘以二把数字右移一位,除以二就要将数字左移一位即可,字符串处理的话,我们只需要将数字末尾赋值成’\0’即可,也就是没有了,直接往右
‘+2’:这个貌似有点麻烦了,因为需要处理进位。我很讨厌进位,非常难搞。加一的规律:从后往前遍历,将每一位赋值成0,直到遇到原本的零,将其赋值成1,结束计算。然鹅,如果原数一个零也没有
例如11111,加一就涉及到进一的问题了。但是,题目中有提到:“数据保证+,-操作不会导致最高位的进位与退位”,所以,我们并不需要考虑这个问题而将整个数组移位。
‘-2’:类似地,-2也是+2的逆运算,原来是将一变零,遇到原本就是零为止,现在只需要将零变一,遇到原本就是一为止。
搞个循环就行了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
char s[100000005],oper[6000005];
int main()
{
int n,m;
scanf("%d%d%s%s",&n,&m,s,oper);
for(int i=0;i<m;i++)
{
switch(oper[i])
{
case '*': s[n++]='0';break;
case '/': s[--n]='\0';break;
case '+': for(int k=n;s[--k]!='0'&&(s[k]='0')||!(s[k]='1');); break;
case '-': for(int k=n;s[--k]!='1'&&(s[k]='1')||!(s[k]='0');); break;
}
}
puts(s);
return 0;
}