我发现这个题目还有很多人不会,所以我想把我的代码贴出来帮助大家(有注释,建议大家不要直接抄袭,理解为主)程序行数较多,建议耐心看完
#include <bits/stdc++.h>
using namespace std;
int cnt;
int ans;
string a;
bool p=false;
bool px(){//判断是否有符号
for(int i=0;i<a.length();i++){
if(a[i]<'0'||a[i]>'9'){
return true;
}
}
return false;
}
int main(){
cin>>a;
if(px()==false){
for(int i=a.length()-1;i>=0;i--){//整数
if(p==false&&a[i]=='0'){//只要最高位出现了其他的数字
continue;//p==false就不成立了
}//因为输出其他数字的时候将p=true了
else{//后面的判断最高位是0也是一样
cout<<a[i];
p=true;
}
}
if(p==false){//对0的特殊处理:因为如果整数只输入了0
cout<<0;//而0反转还是0但是它也在最高位不让输出了
}//所以可以直接输出,后面的特殊处理也是一样
}
else if(px()==true){
for(int i=0;i<a.length();i++){
if(a[i]<'0'||a[i]>'9'){
if(a[i]=='.'){//小数
cnt=1;
ans=i;//因为小数点,和分数线的位置不确定
break;//所以用ans来记录下标
}
if(a[i]=='%'){//百分数
cnt=2;
break;//但是百分号,一直在最后就不用记录位置
}
if(a[i]=='/'){ //分数
cnt=3;
ans=i;
break;
}
}
}
if(cnt==1){
p=false;//小数处理
for(int i=ans-1;i>=0;i--){
if(a[i]=='0'&&p==false){
continue;
}//小数的整数部分
else{
cout<<a[i];
p=true;
}
}
if(p==false){
cout<<0;//0的特殊处理
}
p=false;
cout<<'.';
string h="";
for(int i=ans+1;i<a.length();i++){
if(a[i]=='0'&&p==false){
continue;
}
else{//小数的小数部分
h+=a[i];//前面是0的地方先排除掉
p=true; //出现其他数字就不用在判断了
}
}
for(int i=h.length()-1;i>=0;i--){
cout<<h[i];//在输出
}
if(p==false){
cout<<0;//0的特殊判断
}
}
if(cnt==2){
p=false;
for(int i=a.length()-1;i>=0;i--){
if(a[i]=='0'&&p==false){
continue;
}
else if(a[i]!='%'){//百分数跟整数就差了个符号就不说了
cout<<a[i];
p=true;
}
}
if(p==false){
cout<<0;
}
cout<<'%';
p=false;
}
if(cnt==3){
p=false;
for(int i=ans-1;i>=0;i--){
if(a[i]=='0'&&p==false){
continue;
}
else{
cout<<a[i];
p=true;
}
}
if(p==false){
cout<<0;//分数相当于符号把整串数字分为两个整数
}//也差不多
cout<<'/';
p=false;
for(int i=a.length()-1;i>=ans+1;i--){
if(a[i]=='0'&&p==false){
continue;
}
else{
cout<<a[i];
p=true;
}
}if(p==false){
cout<<0;
}
p=false;
}
}
return 0;
}