数字翻转分为很多类,包括整数(这类最好处理)小数,分数,百分数;
对于这些集合在一起,我们就可以将数字转化为字符串处理;
对于整数和百分数,我们翻转时,只需要将后面的0去掉即可;
对于小数和分数,我们就要注意小数点(分式号)前后的0都要去掉;
下面呈上代码(代码有点长,。。。。。。勿喷。。。嘻嘻
#include<iostream> #include<cstring> using namespace std; int main() { string s; cin>>s; int x=0; int slen=s.length(); for(int i=0;i<slen;i++) { if(s[i]=='/'||s[i]=='.'||s[i]=='%') x=i; } int u;//统计末尾有几个0; if(x==0)//处理整数; { for(int i=slen-1;i>=0;i--) { if(s[i]!='0') { u=i;//记录末尾为0且连续为0到的位置 ,下面有很多这样的代码,功能一样 break; } } for(int i=u;i>=0;i--)//反向输出数字; { cout<<s[i]; } }//整数处理完毕 else if(x!=0) { if(s[x]=='.')//翻转小数点前面的数字; { for(int i=x-1;i>=0;i--) { if(s[i]!='0') { u=i;//记录末尾为0且连续为0到的位置 break; } } for(int i=u;i>=0;i--) { cout<<s[i]; } cout<<s[x]; for(int i=x+1;i<slen;i++)//翻转小数点后面的数字 { if(s[i]!='0') { u=i; break; } } for(int i=slen-1;i>=u;i--) cout<<s[i]; }//小数处理完毕 if(s[x]=='/') { for(int i=x-1;i>=0;i--)//翻转分数号的前面的数字 { if(s[i]!='0') { u=i; break; } } for(int i=u;i>=0;i--)//输出前面翻转后的数字 { cout<<s[i]; } cout<<s[x]; for(int i=slen-1;i>x;i--)//翻转分数号后面的数字 { if(s[i]!='0') { u=i; break; } } for(int i=u;i>x;i--) { cout<<s[i];//输出后面翻转后的数字 } }//分数处理完毕 if(s[x]=='%') { for(int i=slen-2;i>=0;i--) { if(s[i]!='0') { u=i; break; } } for(int i=u;i>=0;i--) cout<<s[i]; cout<<s[x]; } //百分数处理完毕 } return 0; }
代码确实有点长,但是比较容易理解。