一道水题! 但细节很多
题目
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数之改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。
易错:
-输入1.00 ,输出1.0
-输入0000000000,输入0.
代码:
#include<iostream>
#include<string>
using namespace std;
string turn_zhengshu(string word);
string dele0(string word);
int main()
{
int sign=0; //1:整数 2:小数 3:分数 4:百分数
string word;
unsigned i=0;
getline (cin,word);
for(i;i<word.size();i++){
if(word[i]=='.') {sign=2;break;}
else if(word[i]=='/') {sign=3;break;}
else if(word[i]=='%') {sign=4;break;}
else sign=1;
}
///开始反转
string fanzhuan,qian,hou;
if(sign==1) {
fanzhuan=turn_zhengshu(word);
cout<<fanzhuan<<endl;
}
else if(sign==2||sign==3){
for(i=0;i<word.size();i++){
if(word[i]!='.'&&word[i]!='/') qian+=word[i];
else break;
}
qian=turn_zhengshu(qian);
i++;
while(i<word.size()){
hou+=word[i];
i++;
}
hou=turn_zhengshu(hou);
hou=dele0(hou);
if(sign==2) cout<<qian<<"."<<hou<<endl;
else if(sign==3) cout<<qian<<"/"<<hou<<endl;
}
else if(sign==4){
int len1=word.size();
word[len1-1]='0';
fanzhuan=turn_zhengshu(word);
cout<<fanzhuan<<"%"<<endl;
}
}
string turn_zhengshu(string word) //整数反转并删除末尾的0
{
int len=word.size()-1;
string newstr;
while(1){
if(word[len]=='0') len--;
else break;
}
if(len==-1) newstr+='0';
while(len!=-1){
newstr+=word[len];
len--;
}
return newstr;
}
string dele0(string word) //删除末尾的0 但不反转
{
int len=word.size()-1;
string newstr;
while(1){
if(word[len]=='0') len--;
else break;
}
if(len==-1) {newstr+='0'; return newstr;}
for(int j=0;j<=len;j++){
newstr+=(word[j]);
}
return newstr;
}