题解 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来继续输入字符串,整形变量会变成,
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_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++;
}
}
}
望通过。