解题报告 P2104 【二进制】

· · 题解

模拟大法好

模拟二进制的运算,

+从后向前找到第一个为0的,赋为1,中间为1的全赋为0

-从后向前找到第一个为1的,赋为0,中间为0的全赋为1

‘*’ 相当于<<操作 ++l,将二进制数长度加1,最后一位赋为0

‘/’ 相当于>>操作 --l,将二进制数长度减1

# pragma GCC optimize "O3"
#include<bits/stdc++.h>

using namespace std;

int n,m,k[5],l,tl;
char a[50000010];
void scz(char x) {
    if(x=='-') {
        int tp;
        for(int j=l; j>=1; j--) {
            if(a[j]=='1') {
                tp=j;
                break;
            }
        }
        a[tp]='0';
        for(int j=tp+1; j<=l; j++) a[j]='1';
    } else if(x=='+') {
        for(int i=l; i>=1; i--){
            if(a[i]=='0') {
                a[i]='1';
                break;
            }
            else a[i]='0';
        }
    } else if(x=='*') {
        a[++l]='0';
    } else if(x=='/') {
        if(l!=1) --l;
        else a[l]='0';
    }
}
void Print() {
    for(int i=1; i<=l; i++) {
        cout<<a[i];
    }
    cout<<"\n";
}
int main() {
    cin>>n>>m;
    l=n;
    for(int i=1; i<=n; i++) cin>>a[i];
    for(int i=1; i<=m; i++) {
        char b;
        cin>>b;
        scz(b);
    }
    Print();
    return 0;
}