题解 P1953 【易语言】

· · 题解

题目链接

题目大意:

输入第一行有可能是格式,也有可能是数字。若是格式,之后的所有输入都被替换。若是数字,之后的输入只需加上序号(零或一)。

大体思路:

监测输入是数字还是字符串,再分别进行解题。

前置代码:

判断是不是数字:

bool isnum(char c){return c>='0'&&c<='9';}

获取一个字符串中的数字

string str;
stringstream ss;
int num=0;
for(int i=0;i<str.size()&&isnum(str[i]);i++){
    int n;
    ss<<str[i];
    ss>>n;
    ss.clear;
    num+=n;
    num*=10;
}
num/=10;

判断输入

这里使用一个cin的特性,若是整形变量却流入了字符串,则cin会锁住。所以,可以使用cin.clear来继续输入字符串,整形变量会变成,0 。代码:

if(!(cin>>f)){
    cin.clear();
    cin>>in>>out; 
}

然后判断f in out和初始值一不一样就行。没错我的初始值是114514

if(in!="114514"&&out!="114514"){
    //do something
}
else if(f!=114514){
    //do something
}

一.调整格式

如果输入字符串,就判断是 . 前输入了数字,还是结尾处输入数字,然后将 . 前的部分录入一个字符串 in_for. 后的部分录入一个字符串 in_back , 输出 in_for<<number<<"."<<in_backin_for<<"."<<in_back<<number ,视数字位置情况而定。

这种情况中之后输入的所有字符都不重要,因为格式已经被调整过了。

注意 如果数字是在字符串末尾要倒序录入 number

代码中有注释。不要管这些奇怪的变量名

bool midnum=0,backnum=0;//判断数字位置
    int bp,ffff=0;
    string b_in="",b_back="";
    if(isnum(in[in.size()-1])){//如果是末尾有数字
        backnum=1;
    }
    for(bp=0;in[bp]!='.';bp++){ 
        if(in[bp]>='0'&&in[bp]<='9'){
            for(int i=bp;in[i]>='0'&&in[i]<='9';i++){//用字符串流录入数字
                ss<<in[i];
                ss>>ffff;
                ss.clear();//血的教训
                number+=ffff;
                number*=10;
                IAKIOI++;//数字的位数
                bp++;
            }
            number/=10;//由于多乘了一个10,记得除回去
            ss.clear();
            midnum=1;//中间有数字
            break;
        }
    }
    for(int i=0;i<bp-IAKIOI;i++)b_in+=in[i];
    if(backnum==0)//如果末尾无数字
    for(int i=bp+1;i<in.size();i++)b_back+=in[i];
    else{
        int jja=0;
        for(int i=in.size()-1;isnum(in[i]);i--){//奇怪的倒序录入数字qaq
            int n;
            ss<<in[i];
            ss>>n;
            ss.clear();
            n=n*pow(10,jja);
            number+=n;
            jja++;
        }
        for(int i=bp+1;i<in.size()-jja;i++)b_back+=in[i];
    }
    string sin,sout;
    int ti=number+1;
    while(cin>>sin>>sout&&ti++){
        if(midnum==1)
        cout<<b_in<<ti-2<<"."<<b_back<<" "<<b_in<<ti-2<<"."<<out<<endl;
        else if(backnum==1)
        cout<<b_in<<"."<<b_back<<ti-2<<" "<<b_in<<"."<<out<<ti-2<<endl;
    }
}//愉快地收尾

二.调整序号

这种情况是输入一个数字,但数字位置仍不知道,所以还是要判定一下。

大体思路和第一种情况差不多,但是每次输入输出都要获取格式。

代码:

else if(f==1||f==0){
    string sin,sout;
    while(cin>>sin>>sout){
        string b_in="",b_out="";
        string f_in="",f_out="";
        int pin,pnum=0,pout;
        bool backnum=0,midnum=0;
        if(isnum(sin[sin.size()-1]))backnum=1;
        for(pin=0;sin[pin]!='.'&&(!isnum(sin[pin]));pin++)b_in+=sin[pin];
        pout=pin;
        if(isnum(sin[pout])){
            while(isnum(sin[pout])){
                pout++;
            }
            midnum=1;
        }
        pout++;
        for(pout;!isnum(sin[pout])&&pout<sin.size();pout++)b_out+=sin[pout];
        for(pin=0;sout[pin]!='.'&&(!isnum(sout[pin]));pin++)f_in+=sout[pin];;
        pout=pin;
        if(isnum(sout[pout])){
            while(isnum(sout[pout])){//并不需要录入,只需要记录位数。
                pout++;
            }
        }
        pout++;
        for(pout;!isnum(sout[pout])&&pout<sout.size();pout++)f_out+=sout[pout];
        if(midnum==1&&backnum==0){//由于不知道数字位置所以有三种情况
            cout<<b_in<<f<<"."<<b_out<<" ";
            cout<<f_in<<f<<"."<<f_out<<endl; 
        }
        else if(midnum==0&&backnum==1){
            cout<<b_in<<"."<<b_out<<f<<" ";
            cout<<f_in<<"."<<f_out<<f<<endl; 
        }
        else if(midnum==0&&backnum==0){//可能没有数字。
            cout<<b_in<<"."<<b_out<<" ";
            cout<<f_in<<"."<<f_out<<endl;
        }
        f++;
    }
}

所以大体思路就是这样,只有代码完成稍需要细心。

完整代码:

#include<bits/stdc++.h>
using namespace std;
bool isnum(char c){return c>='0'&&c<='9';}
#define MAXN 50005
int main(){
    int IAKIOI=0;
    int f;
    stringstream ss;
    int number=0;
    string in="114514",out="114514";
    if(!(cin>>f)){
        cin.clear();
        cin>>in>>out; 
    }
    if(in!="114514"&&out!="114514"){
        bool midnum=0,backnum=0;
        int bp,ffff=0;;
        string b_in="",b_back="";
        if(isnum(in[in.size()-1])){
            backnum=1;
        }
        for(bp=0;in[bp]!='.';bp++){ 
            if(in[bp]>='0'&&in[bp]<='9'){
                for(int i=bp;in[i]>='0'&&in[i]<='9';i++){
                    ss<<in[i];
                    ss>>ffff;
                    ss.clear();
                    number+=ffff;
                    number*=10;
                    IAKIOI++;
                    bp++;
                }
                number/=10;
                ss.clear();
                midnum=1;
                break;
            }
            else backnum=1;
        }
//      cout<<number<<endl;
//      cout<<bp<<endl;
        for(int i=0;i<bp-IAKIOI;i++)b_in+=in[i];
        if(backnum==0)
        for(int i=bp+1;i<in.size();i++)b_back+=in[i];
        else{
            int jja=0;
            for(int i=in.size()-1;isnum(in[i]);i--){
                int n;
                ss<<in[i];
                ss>>n;
                ss.clear();
                n=n*pow(10,jja);
                number+=n;
                jja++;
            }
            for(int i=bp+1;i<in.size()-jja;i++)b_back+=in[i];
        }
        string sin,sout;
        int ti=number+1;
        while(cin>>sin>>sout&&ti++){
            if(midnum==1)
            cout<<b_in<<ti-2<<"."<<b_back<<" "<<b_in<<ti-2<<"."<<out<<endl;
            else if(backnum==1)
            cout<<b_in<<"."<<b_back<<ti-2<<" "<<b_in<<"."<<out<<ti-2<<endl;
        }
    }
    else if(f==1||f==0){
        string sin,sout;
        while(cin>>sin>>sout){
            string b_in="",b_out="";
            string f_in="",f_out="";
            int pin,pnum=0,pout;
            bool backnum=0,midnum=0;
            if(isnum(sin[sin.size()-1]))backnum=1;
            for(pin=0;sin[pin]!='.'&&(!isnum(sin[pin]));pin++)b_in+=sin[pin];
            pout=pin;
            if(isnum(sin[pout])){
                while(isnum(sin[pout])){
                    pout++;
                }
                midnum=1;
            }
            pout++;
            for(pout;!isnum(sin[pout])&&pout<sin.size();pout++)b_out+=sin[pout];
            for(pin=0;sout[pin]!='.'&&(!isnum(sout[pin]));pin++)f_in+=sout[pin];;
            pout=pin;
            if(isnum(sout[pout])){
                while(isnum(sout[pout])){
                    pout++;
                }
            }
            pout++;
            for(pout;!isnum(sout[pout])&&pout<sout.size();pout++)f_out+=sout[pout];
            if(midnum==1&&backnum==0){
                cout<<b_in<<f<<"."<<b_out<<" ";
                cout<<f_in<<f<<"."<<f_out<<endl; 
            }
            else if(midnum==0&&backnum==1){
                cout<<b_in<<"."<<b_out<<f<<" ";
                cout<<f_in<<"."<<f_out<<f<<endl; 
            }
            else if(midnum==0&&backnum==0){
                cout<<b_in<<"."<<b_out<<" ";
                cout<<f_in<<"."<<f_out<<endl;
            }
            f++;
        }
    }
}

望通过。