1 条题解

  • 0
    @ 2025-8-24 21:55:12

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar B_Qu1e7
    URhowUC

    搬运于2025-08-24 21:55:12,当前版本为作者最后更新于2017-12-24 18:35:25,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    写了一篇没人写过的题解

    其实这道题说简单,是很简单

    但是难就难在它Error的判断和如何操作以0开头的单元

    还有一个大家普遍被难的就是,不能操作到一半,输出输一半

    哎,发现不对了,赶紧输出Error,这样输出就会变得很奇怪

    所以最好像本解的put一样,先存进一个字符串,最后输出

    下面我们来看看解析(纯模拟)

    #include<iostream>
    using namespace std;
    string s,put="",nm;int pl=0,c,a,b;
    string del(string c){for(int i=0;i<8;i++)c.erase(0,1);return c;}
    //上面这个地方是每8位操作完毕后清除一次
    //个人比较习惯操作字符串时都是在首位操作
    int main()
    {
        cin>>s;
        if(s.size()%8){cout<<"Error";return 0;}
        //这个地方判断,因为它每8位一个单元
        //所以一定是整数个单元。(易判断)
        while(s.size())
        {
            if((s[0]!='0'&&s[0]!='1')||(s[1]!='0'&&s[1]!='1')||(s[2]!='0'&&s[2]!='1')||(s[3]!='0'&&s[3]!='1')||(s[4]!='0'&&s[4]!='1')||(s[5]!='0'&&s[5]!='1')||(s[6]!='0'&&s[6]!='1')||(s[7]!='0'&&s[7]!='1')){cout<<"Error";return 0;}
            //这个地方写了这么大一长串,啥意思呢
            //其实就是判断,因为它是一个二进制加密码
            //所以每一位都必须是0or1(还不如开头直接全判)
            else if(s[0]=='1'&&s[1]=='1'&&s[2]=='1'){if(pl){cout<<"Error";return 0;}s=del(s);put+=" ";continue;}
            //这个地方的话是加空格
            //但要注意,如果前一个单元是请求加法单元
            //那么这个单元是空格,就错误了,所以应该判错
            else if(s[0]=='1'&&s[1]=='0'&&s[2]=='1')
            {
                if(pl){cout<<"Error";return 0;}
                //跟前一注释一样
                int d=(s[7]-48)*1+(s[6]-48)*2+(s[5]-48)*4+(s[4]-48)*8+(s[3]-48)*16;
                //这里算这个字母是什么
                if(d>25){cout<<"Error";return 0;}
                //防止超过
                put+=(char)(65+d);
                //注意一下,如样例,10100000代表A
                //那么可以推出公式65+00000=ascii(65)=A
            }
            else if(s[0]=='0')
            {
                a=((s[7]-48)*1+(s[6]-48)*2+(s[5]-48)*4+(s[4]-48)*8+(s[3]-48)*16+(s[2]-48)*32+(s[1]-48)*64)/2;
                if(!pl)//还没有加数
                {
                    b=a,pl=1;//交换加数和被加数
                }
                else if(pl)//有加数
                {
                    c=a+b;a=b=pl=0;nm="";
                    if(!c)nm="0";
                    else while(c){nm=(char)(c%10+48)+nm,c/=10;}
                    //这里,c有可能=0或高于一位数
                    //c=0在前一句,而后面是处理多位数
                    put+=nm;
                    //加到输出中
                }
            }
            else{cout<<"Error";return 0;}
            //如果这个单元不符合任意规则则出错
            s=del(s);
            //删除前八
        }
        if(pl)cout<<"Error";//最后单元为加数(无被加数)
        else cout<<put;
    }
    
    • 1

    信息

    ID
    2894
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者