体会:字符串处理着实是弱项啊,一两个星期没撸代码就手生了,蒟蒻一枚。
题解:
①整数和百分数好解决,而小数和分数就要分前部分和后部分(根据符号划分)了。但是不管是哪一种,翻转之后的前置零是都要去掉的。
②第一步出来完后,直接判断字符串中存在‘%’或者不存在符号,换行一下,整数和百分数就解决了。
③接下来处理小数和分数。因为这两种前部分是不存在翻转之后的后置零的,所以在第一步完成后就可以不用管前部分了。但是后部分比较特殊,前置零和后置零都要去掉。所以鄙人这是用了"两头缩"的方法。
④最重要的一点是全是零的情况,尤其小数,0.0,还是要输出零的。
代码:
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6;
char s[25];
int main(){
int p,i,len;
char ch;
cin >> s;
len = strlen(s);
ch = 0;
p = len;
for(i = 0; i < len;++i){
if(s[i] < '0' || s[i] > '9'){
p = i;
ch = s[i];
break;
}
}
i = p - 1;
while(s[i] == '0' && i > 0) --i; //消除前半部分数的翻转后前导零
for(;i >= 0; --i)
cout << s[i];
if(ch == 0)
cout << endl;
else if(ch == '%')
cout << ch << endl;
else{
cout << ch;
int l = p+1,r = len-1;
while(s[l]== '0' && l < r) l++; //消除后半部分数的翻转后前导零
while(s[r]== '0' && r > l) r--; //消除后半部分数的翻转后后置零
for(i = r; i >= l; --i)
cout << s[i] ;
cout << endl;
}
return 0;
}