1 条题解
-
0
自动搬运
来自洛谷,原作者为

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来继续输入字符串,整形变量会变成, 。代码:if(!(cin>>f)){ cin.clear(); cin>>in>>out; }然后判断
f in out和初始值一不一样就行。没错我的初始值是114514if(in!="114514"&&out!="114514"){ //do something } else if(f!=114514){ //do something }一.调整格式
如果输入字符串,就判断是
.前输入了数字,还是结尾处输入数字,然后将.前的部分录入一个字符串in_for,.后的部分录入一个字符串in_back, 输出in_for<<number<<"."<<in_back或in_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
- 上传者