1 条题解

  • 0
    @ 2025-8-24 21:32:15

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar JJA_
    whk好难whk好难whk好难whk好难whk好难whk好难whk好难whk好难whk好难whk好难

    搬运于2025-08-24 21:32:15,当前版本为作者最后更新于2021-01-25 10:10:50,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    题目链接

    题目大意:

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

    大体思路:

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

    前置代码:

    判断是不是数字:

    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来继续输入字符串,整形变量会变成,00 。代码:

    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++;
    		}
    	}
    }
    

    望通过。

    • 1

    信息

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