P1553 数字反转(升级版)

一道水题! 但细节很多

题目

给定一个数,请将该数各个位上数字反转得到一个新数。
这次与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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值