洛谷P1553 数字反转(升级版)

2023-05-16

洛谷P1553 数字反转(升级版)

  • 题目描述
  • 输入格式
  • 输出格式
  • 输入输出样例
  • 说明/提示
  • 个人理解
    • 整数
    • 百分数
    • 分数
    • 小数
  • AC代码
  • 写在最后

题目描述

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

这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。

  • 整数反转是将所有数位对调。

  • 小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。

  • 分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。

  • 百分数的分子一定是整数,百分数只改变数字部分。

输入格式

一个数 s s s

输出格式

s s s的反转数

输入输出样例

输入 #1
5087462
输出 #1
2647805
输入 #2
600.084
输出 #2
6.48
输入 #3
700/27
输出 #3
7/72
输入 #4
8670%
输出 #4
768%

说明/提示

所有数据:25%s是整数,不大于20位

25%s是小数,整数部分和小数部分均不大于10位

25%s是分数,分子和分母均不大于10位

25%s是百分数,分子不大于19位

(20个数据)

数据保证:

  • 对于整数翻转而言,整数原数和整数新数满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数和原来的数字的最高位数字不应为零。

  • 对于小数翻转而言,其小数点前面部分同上,小数点后面部分的形式,保证满足小数的常见形式,也就是末尾没有多余的 00(小数部分除了 00 没有别的数,那么只保留 11 个 00。若反转之后末尾数字出现 00,请省略多余的 00)

  • 对于分数翻转而言,分数不约分,分子和分母都不是小数。输入的分母不为0。与整数翻转相关规定见上。

  • 对于百分数翻转而言,见与整数翻转相关内容。

数据不存在负数。

个人理解

字符串题,不如把分数,小数,百分数,整数分开考虑。
C++的string类比C友好得多,STL标准库也有很多封装好的函数可以用。
那就先写下头文件好了。

#include<iostream>
#inlcude<string>
#include<algorithm>

整数

整数只需要逆序排好,把末尾的0去掉。
在这里我用了很笨的方法= =
先把string逆序,然后转为长整型再转回string

reverse(s.begin(),s.end());
long long temp = stoll(s);
s1 = to_string(temp);

百分数

百分数相当于整数的逆序后面加个百分号
那就先逆序再push_back一个百分号好了

		for(int i = len-2;i>=0;i--)
        {
            s1.push_back(s[i]);
        }
        long long temp = stoll(s1);
        s1 = to_string(temp);
        s1.push_back('%');

分数

分数和小数都可以看成三部分: S 1 S_1 S1+符号+ S 2 S_2 S2
所以用两个string对象s1、s2,分别转成长整型再转回string
最后连起来(可能确实比较笨)

		for(int i = frac-1;i>=0;i--)
        {
            s1.push_back(s[i]);
        }
        long long temp1 = stoll(s1);
        s1 = to_string(temp1);
        for(int i = len-1;i>frac;i--)
        {
            s2.push_back(s[i]);
        }
        long long temp2 = stoll(s2);
        s2 = to_string(temp2);
        s1 = s1+"/"+s2;

小数

小数的坑最多(-_-#)
小数有几个特殊的地方:

  • 末尾不能有0,例如5.02转成5.2
  • 后面只有0要输出.0,例如5.0转成5.0

所以s2最后要把末尾的0全部pop_back掉,只留一位。
其余的操作和分数一样。

		for(int i = dot-1;i>=0;i--)
        {
            s1.push_back(s[i]);
        }
        long long temp1 = stoll(s1);
        s1 = to_string(temp1);
        for(int i = len-1;i>dot;i--)
        {
            s2.push_back(s[i]);
        }
        long long temp2 = stoll(s2);
        s2 = to_string(temp2);
        int k = s2.length()-1;
        while(s2[k]=='0'&&k>0)
        {
            s2.pop_back();
            k--;
        }
        s1 = s1+"."+s2;

AC代码

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
void swap(int dot,int frac,int pt,string s)
{
    string s1,s2;
    int len = s.length();
    if(dot>0)
    {
        for(int i = dot-1;i>=0;i--)
        {
            s1.push_back(s[i]);
        }
        long long temp1 = stoll(s1);
        s1 = to_string(temp1);
        for(int i = len-1;i>dot;i--)
        {
            s2.push_back(s[i]);
        }
        long long temp2 = stoll(s2);
        s2 = to_string(temp2);
        int k = s2.length()-1;
        while(s2[k]=='0'&&k>0)
        {
            s2.pop_back();
            k--;
        }
        s1 = s1+"."+s2;
    }
    else if(frac>0)
    {
        for(int i = frac-1;i>=0;i--)
        {
            s1.push_back(s[i]);
        }
        long long temp1 = stoll(s1);
        s1 = to_string(temp1);
        for(int i = len-1;i>frac;i--)
        {
            s2.push_back(s[i]);
        }
        long long temp2 = stoll(s2);
        s2 = to_string(temp2);
        s1 = s1+"/"+s2;
    }
    else if(pt>0)
    {
        for(int i = len-2;i>=0;i--)
        {
            s1.push_back(s[i]);
        }
        long long temp = stoll(s1);
        s1 = to_string(temp);
        s1.push_back('%');
    }
    else
    {
        reverse(s.begin(),s.end());
        long long temp = stoll(s);
        s1 = to_string(temp);
    }
    cout<<s1;
}
int main()
{
    string s,s1;
    cin>>s;
    int dot = s.find(".");
    int frac = s.find("/");
    int pt = s.find("%");
    swap(dot,frac,pt,s);
    return 0;
}

写在最后

虽然翁恺老师说要避免代码复制,代码复制是质量不好的表现。

但这几部分还是挺像的。。

只是用这题熟悉一下STL标准库的函数,实在不太喜欢造轮子。

欢迎大佬们教我刷题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

洛谷P1553 数字反转(升级版) 的相关文章

随机推荐

  • 2016年淘宝购买华硕FL5900UQ7500惨痛经历教训总结

    举报淘宝店铺名称 上海华硕数码商城 掌柜 xff1a 攀鸣机电科技 店铺淘宝地址 https shop156229885 taobao com spm 61 2013 1 0 0 3pcgPU 购买商品地址 https item taoba
  • 农村常见60种野生中草药

    1 曼陀罗 xff08 大喇叭花 狗核桃 xff09 有毒 xff0c 为镇静要药 xff0c 可松弛肌肉 xff0c 古代麻沸散和云南白药保险子主要成分 xff0c 民间花 子 叶 根各有不同用法 xff0c 分治不同疾病 xff0c 子
  • sdk manager打不开闪退问题完美解决2017年最新方法

    这几天更新了android studio和sdk xff0c 结果sdk manager怎么也打不开 xff0c eclipse也不能用了 xff0c 这个很郁闷 xff0c 于是到网上找到了以下方法 xff0c 结果都失败了 xff0c
  • 淘宝商品类目查询方法怎样查看别人商品的类目淘宝类目查询工具软件

    作为一个淘宝卖家时常会发生不知道把自己宝贝放在哪个类目下面导致被系统提示违规 xff0c 这个非常苦恼而且不知所措 xff0c 最有效办法就是查看淘宝正在热销同类商品或者宝贝的类目 xff0c 但是进去别人店铺之后发现根本找不到别人把宝贝放
  • win10-11全版本下载地址MSDN纯净版ISO-20220217更新

    本文搜集整理微软官方发布的Windows 10正式版镜像下载链接 xff0c 从RTM原始正式版开始 xff0c 按照时间倒序排列 xff0c 即越往上的越新 转载 xff1a http news mydrivers com 1 440 4
  • win10远程win10的问题

    在被远程电脑上打开注册表 定位到 HKLM SYSTEM CurrentControlSet Control Terminal Server Winstations RDP tcp 找到 34 SecurityLayer 34 xff0c
  • C++11 thread 在 Windows 系统中无法使用问题解决

    最近在Windows10上使用C 43 43 11的 thread 时遇到了 34 未定义标识符 34 thread 34 34 的问题 xff0c 但是我已经包含了 lt thread gt 头文件 xff0c 这种问题在Linux上就没
  • Arch Install & some configuration

    一 安装 到 http mirror lupaworld com archlinux iso latest 或者 http ftp sjtu edu cn pub mirror2 www archlinux org iso latest 下
  • ubuntu20.04服务器安装xrdp

    span class token function sudo span span class token function apt span update span class token punctuation span span cla
  • ubuntu18 xrdp安装

    span class token comment 下载最新的安装脚本 span span class token function apt span span class token function install span tightv
  • Linux开发工具--makefile

    文章目录 makefileLinux第一个小程序 进度条Git三板斧 makefile 会不会写makefile xff0c 从一个侧面说明了一个人是否具备完成大型工程得能力 xff0c makefile带来的好处就是 自动化编译 xff0
  • Linux下安装MySQL

    第一步 xff1a 创建虚拟机 第二步 xff1a 虚拟机操作 vi etc sysconfig network scripts ifcfg ens33 将里面的unboot 61 on改为unboot 61 yes 紧接着重启网卡 sys
  • Ubuntu系统安装MySQL5.7&&MySQL8.x

    MySQL5 7版本在Ubuntu xff08 WSL环境 xff09 系统安装 课程中配置的WSL环境是最新的Ubuntu22 04版本 xff0c 这个版本的软件商店内置的MySQL是8 0版本 所以我们需要额外的步骤才可以安装5 7版
  • win10 安装debian,安装docker

    参考文章 xff1a https docs microsoft com zh cn windows wsl install win10 https docs docker com engine install debian https do
  • Jenkins结合SVN报错E230001: Server SSL certificate verification failed的解决方法

    最近公司搬家 xff0c 之前用来做一些自动化工作的Jenkins服务器 罢工 了 在最后SVN提交时报了一个之前没有的错误 xff1a svn E230001 Commit failed details follow svn E23000
  • 为WSL的ubuntu子系统安装图形化界面

    WSL只提供黑窗口登录功能 xff0c 为了使用gui xff0c 需要安装gui并且使用远程连接的方式登录 更新源 sudo apt get update 安装xorg sudo apt get install xorg 安装xfce4
  • Json 转sqlserver创建表脚本 JSONtoSQLGenerator

    This code takes a JSON input string and automatically generates SQL Server CREATE TABLE statements to make it easier to
  • 如何远程登陆Linux图形界面

    可以使用xrdp软件 xff0c 下面是具体的操作步骤 xff1a 1 给Linux系统安装xrdp工具 xff0c 在命令行中输入 xff1a sudo apt get install xrdp 2 在windows中点击开始 gt 运行
  • 信息学奥赛一本通-1049:晶晶赴约会

    题目描述 晶晶的朋友贝贝约晶晶下周一起去看展览 xff0c 但晶晶每周的1 3 5有课必须上课 xff0c 请帮晶晶判断她能否接受贝贝的邀请 xff0c 如果能输出YES xff1b 如果不能则输出NO 注意YES和NO都是大写字母 xff
  • 洛谷P1553 数字反转(升级版)

    洛谷P1553 数字反转 xff08 升级版 xff09 题目描述输入格式输出格式输入输出样例说明 提示个人理解整数百分数分数小数 AC代码写在最后 题目描述 给定一个数 xff0c 请将该数各个位上数字反转得到一个新数 这次与NOIp20