P1553 数字反转(升级版)

来源:互联网 发布:家居设计软件手机 编辑:程序博客网 时间:2024/05/22 03:25

一道水题! 但细节很多

题目

给定一个数,请将该数各个位上数字反转得到一个新数。
这次与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;}
0 0