首页 > 其他分享 >洛谷 P1553 数字反转(升级版) C语言 stl

洛谷 P1553 数字反转(升级版) C语言 stl

时间:2024-12-07 08:59:16浏览次数:6  
标签:子串 洛谷 stl 反转 pos 整数 C语言 sr 小数

题目:

https://www.luogu.com.cn/problem/P1553

题目背景

以下为原题面,仅供参考:

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

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

题目描述

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

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

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

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

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

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

输入格式

一个实数 s

输出格式

一个实数,即 s 的反转数

思路:先判断是否有符号,有符号就分成两个子串分别处理,无符号就单独处理。写好前置0和后置0的函数,左子串都是要清除前置0,注意%和/的右子串 前置0 和 后置0 都要去除。'.'右子串只需要清除后置0。

#include<iostream> 
#include<string>
#include<algorithm>
using namespace std;
string front(string S)//去除前置0 
{
    int pos = 0; //从左往右记录第一个非'0'的下标 
    for (int i = 0; i < S.size(); i++)
    {
        if (S[i] != '0')
        {
            pos = i; 
            break;
        }
    }
    
    if (pos > 0)  //不是只有一个'0' 
    {
        S.erase(0, pos); // 删除前置0 
    }
    //如果只有一个0就不会运行删除erase函数,直接返回'0' 
    return S;
}

string rear(string S)
{
    int pos = S.size() - 1; // 记录从右往左第一个非'0'字符 
    while (pos >= 0 && S[pos] == '0') 
    {
        pos--;
    }

    if (pos != -1) // 不是只有一个'0' 
    {
        S.erase(pos + 1, S.size() - 1 - pos); // 删除 
    }
    //如果只有一个0就不会运行删除erase函数,直接返回'0' 
    return S;
}
int main(void)
{
    bool found = false;
    string s;
    string sl; // 左子串 
    string sr; // 右子串 
    getline(cin, s);

    int p; 
    char ch;  
    for (int i = 0; i < s.size(); i++)//寻找符号下标 
    {
        if (s[i] == '%' || s[i] == '.' || s[i] == '/')
        {
            found = true;
            p = i;//储存下标位置 
            ch = s[i];//储存字符 
            break;
        }
    }

    if(found)//有符号 
    {
        sl = s.substr(0, p); // 左子串 
        sr = s.substr(p + 1, s.size() - (p + 1)); // 右子串 

        reverse(sl.begin(), sl.end()); // 转置左子串 
        reverse(sr.begin(), sr.end()); // 转置右子串 
        
        if(ch == '%' || ch == '/')// % 和 / 的右子串需要去除前置0和后置0 ,左子串都是去除前置0 
        {
            sl = front(sl);
			 
            sr = front(sr);
            sr = rear(sr);
            cout << sl << ch << sr << endl;
        }
        else if(ch == '.')// . 的右子串只要取出后置0 ,左子串都是去除前置0  
        {
            sl = front(sl);
            sr = rear(sr);
            cout << sl << ch << sr << endl;
        }
    }
    else//无符号 
    {
        reverse(s.begin(),s.end());
        s = front(s);//只要去前置0 
        cout << s << endl;
    }



    return 0;
}

标签:子串,洛谷,stl,反转,pos,整数,C语言,sr,小数
From: https://blog.csdn.net/zqystca/article/details/144236565

相关文章

  • C语言专题之get相关函数介绍
    欢迎浏览,以下是对C语言中相关“get”函数结合函数原型的详细介绍:一、getchar函数 1.函数原型:intgetchar(void); 2.详细介绍:   1.这个函数不需要参数,它从标准输入流(通常是键盘输入)读取一个字符。   2.函数返回值为读取到的字符的ASCII码值(以int类型返......
  • C语言:指针基础指导
    1:任何一个地址变量,在没有被赋值之前,没有得到实际的变量地址之前,不能通过*去访问任何数据。一.理解一个变量的存储过程和原理(必须清楚掌握)1、两个操作:(1)inta:在栈中定义了一个变量a,并且在内存中开辟了一个int类型大小的空间,即4个字节,然后让a指向这篇空间,也就是这篇空间,计......
  • 洛谷P1305 新二叉树(c嘎嘎)
    题目链接:P1305新二叉树-洛谷|计算机科学教育新生态题目难度:普及刷题心得:做了几道这种类型的题都不用建树就可以解决,基本上还是利用好树的结构,例如这道题求前序序列(根左右)是可以用递归来求的。无非就是先从根出发,递归遍历左子树,递归遍历右子树,遇到 *直接返回就行了......
  • 洛谷解题日记14||前缀和,差分与离散化
    #include<iostream>#include<vector>#include<algorithm>usingnamespacestd;intmain(){intn;cin>>n;//读取区间的个数nvector<pair<int,int>>intervals(n);//存储区间的起点和终点,使用pair类型//读......
  • C语言第六部分(循环结构)
    C语言循环结构什么是循环代码的重复执行,就叫做循环。循环的分类无限循环:其实就是死循环,程序设计中尽量避免无限循环。程序中的无限循环必须可控。有限循环:循环限定循环次数或者循环的条件。循环的构成循环条件循环体当型循环的实现特点:先判断,后执行,如果条件不满足,......
  • 初探C语言|浅谈函数的递归
    文章目录1.什么是递归?2.递归的两个必要条件代码示例3.两个例题(阶乘和斐波那契)发现问题为什么呢?stackoverflow(栈溢出)常规写法(迭代)4.递归与迭代相比较欢迎讨论:如有错误或不足,欢迎指正和建议,本人主打“听劝”。当然,如有疑问,也期待你在评论区留言互动。点赞+关注:如果......
  • (王道练习代码仓库)408考研真题2022 年42题————C语言
    题目:代码实现:#include<stdio.h>#include<stdlib.h>#include<time.h>#include<string.h>typedefintElemType;typedefstruct{ ElemType*elem; intTableLen;}SSTable;voidST_Init(SSTable&ST,intlen)//申请空间,并进行随机数生成{ ST.Ta......
  • 洛谷题单指南-线段树-P1637 三元上升子序列
    原题链接:https://www.luogu.com.cn/problem/P1637题意解读:统计序列a[1]~a[n]中三元上升子序列的个数,三元上升子序列是指对于1<=i<j<k<=n有a[i]<a[j]<a[k],(a[i],a[j],a[k])成为一组上升子序列。解题思路:1、先思考一下暴力,通过三重循环枚举i,j,k找到所有i<j<k时符合a[i]<a[j]<a[k]......
  • 洛谷 P11362 [NOIP 2024] 遗失的赋值
    题目传送门如果没有其他限制,那么一个二元限制可能出现的方案数为\(v^2\)。考虑\(\{x_n\}\)的一个区间,设其中能放\(t\)个二元限制,它的左右端点有一元限制,求这\(t\)个限制的方案数。设这个数为\(f(t)\)。如果第一个二元限制的\(a\)与左端点\(i\)处的\(x\)值相同,那......
  • 学习C语言升级c++的笔记
    此篇文章在2022年2月8日被记录,工作这两年多了,也没用过C++做开发,令人唏嘘1、#include<cmath>#include<cstdio>用这种方法来调用C语言中的函数2、namespace名字空间,防止命名重复::叫做限定调用符usingnamespaceX:引入整个名字空间usingX::name使用单个名字X::na......