zoukankan      html  css  js  c++  java
  • 字符串--P1553 数字反转(升级版)

    题目描述

    给定一个数,请将该数各个位上数字反转得到一个新数。

    这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。

    输入输出格式

    输入格式:

    一个数s

    输出格式:

    一个数,即s的反转数
    在这里插入图片描述

    AC代码

    #include <iostream>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    
    int main() {
        string instr;
        getline(cin, instr);
    
        //小数
        if (instr.find(".") != string::npos) {
            string::iterator before;
            before = instr.begin() + instr.find(".");
            //左闭右开[0,)
            reverse(instr.begin(), before);
            while ((*instr.begin() - '0') == 0) {
                if (instr.substr(0, instr.find(".")).size() == 1) break;
                instr.erase(instr.begin());
            }
    
            before = instr.begin() + instr.find(".");
            reverse(before + 1, instr.end());
            while ((*(instr.end() - 1) - '0') == 0) {
                if (instr.substr(instr.find(".")).size() == 2) break;
                instr.erase(instr.end() - 1);
            }
        } else
    
            //分数
        if (instr.find("/") != string::npos) {
            string::iterator before;
            before = instr.begin() + instr.find("/");
            //左闭右开[0,)
            reverse(instr.begin(), before);
            while ((*instr.begin() - '0') == 0) {
                if (instr.substr(0, instr.find("/")).size() == 1) break;
                instr.erase(instr.begin());
            }
            before = instr.begin() + instr.find("/");
            reverse(before + 1, instr.end());
            while ((*(before + 1) - '0') == 0) {
    //            if (instr.substr(instr.find("/")).size() == 2) break;
                instr.erase(before + 1);
            }
        } else
            //百分数
        if (instr.find("%") != string::npos) {
            string::iterator before;
            before = instr.begin() + instr.find("%");
            reverse(instr.begin(), before);
            while ((*instr.begin() - '0') == 0) {
                if (instr.substr(0, instr.find("%")).size() == 1) break;
                instr.erase(instr.begin());
            }
        } else {
            //整数
            reverse(instr.begin(), instr.end());
            while ((*instr.begin() - '0') == 0) {
                if (instr.size() == 1) break;
                instr.erase(instr.begin());
            }
        }
        cout << instr;
        return 0;
    }
    

    学到的点

    1 string.substr()函数截取字串
    2 reverse(instr.begin(), before)翻转字符串
    3 erase()删除子字符串,参数是迭代器,如 instr.erase(instr.begin());注意没erase()一个子字符串,其后面的串会先前挪,即迭代器变小(iterator–)

  • 相关阅读:
    不能初始化ps2020,因为意外的遇到文件尾
    关于在云服务器上邮箱等功能无法正常的解决方法|phpcmsv9
    WAMP环境配置|apache24配置|php7配置|MySQL8配置
    SAP(ABAP) ABAP内部外部数据转换常用function
    移动平台对 META 标签的定义
    JavaScript/Jquery:Validform 验证表单的相关属性解释
    android开发问题 Failed to pull selection 菜鸟记录
    下载android sdk更新包离线安装解决方案
    android:inputType常用取值
    访问IIS元数据库失败解决方法
  • 原文地址:https://www.cnblogs.com/sunqiangstyle/p/10312284.html
Copyright © 2011-2022 走看看