首页 > 编程语言 >洛谷算法题P1307 [NOIP2011 普及组] 数字反转

洛谷算法题P1307 [NOIP2011 普及组] 数字反转

时间:2024-11-20 20:47:18浏览次数:3  
标签:10 123 洛谷 NOIP2011 反转 sum 样例 P1307 000

题目

题目描述

给定一个整数 N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。

输入格式

一个整数 N。

输出格式

一个整数,表示反转后的新数。

样例 #1

样例输入 #1

123

样例输出 #1

321

样例 #2

样例输入 #2

-380

样例输出 #2

-83

提示

【数据范围】

-1,000,000,000 < N< 1,000,000,000 。

解法1

这道题,用"/ 和 %"来解;

有一个"坑"是n = 0; 的时候程序会进入"while"的死循环,所以我们一开始先判断n是否为0,为0就直接输出0,然后"return 0; " 结束程序;

程序要求"反转" -1,000,000,000 < N< 1,000,000,000 的数,所以我们设置一个容量为10位的数组存储各个位的数;

先用一个"for"循环来把这些数的每一位提取出来,注意!我们用"s[i] = n / a % 10 "实际上已经把最后一位放在s[0]的位置;

然后将a设为1000000000,是为了让数的每一位都能保存下来,因为我们也不知道要保存多少位数;

接着再用一个"for"循环来将数组s最前面的数加到第一位,接着"a / 10"来加到第二位,以此类推;

最后用一个"while"来去除多余的0;

代码实现

#include<iostream>
int main()
{
    using namespace std;
    long long n, s[10], a = 1, k = 0;
    cin >> n;
    if (n == 0)        // 解决当 "n = 0;" 的特殊情况
    {
        cout << n;
        return 0;
    }
    for (int i = 0; i < 10; i++)
        s[i] = n / a % 10, a *= 10;   // 开始翻转数
    a = 1000000000;
    for (int i = 0; i < 10; i++)
        k += s[i] * a, a /= 10;       // 将翻转的数加成一个整数
    while (k % 10 == 0)
        k /= 10;                      // 将整数多余的0去掉
    cout << k;
    return 0;
}

解法2

解法2是解法1的升级,它将一个需要反转的数的最后一位提取出来,然后赋值给sum,然后sum*10,这样又给下一位提供了一个数位,而已经被提取的位,就被" / "舍弃掉;

相当于:

sum --------- n

0 ---------- 123 0 + 123 % 10 123 /= 10

3 ---------- 12 3 + 12 % 10 12 /= 10

32 ---------- 1 32 + 1 % 10 1 /= 10

321 ---------- 0 321

代码实现

#include<iostream>
int main()
{
    using namespace std;
    int n, sum = 0;
    cin >> n;
    while (n)
        sum = sum * 10 + n % 10, n /= 10;
    cout << sum;
    return 0;
}

收获

这道题巧妙的用到了"/ 和 %",前面我们也遇到了相似的一道题,感兴趣的可以看一下

https://blog.csdn.net/2301_80147864/article/details/143822087?spm=1001.2014.3001.5501

tips:

最后感谢您能看到这里,如果可以的话能不能给我一个点赞加关注,我会每天分享自己的解题思路,您的认可是我继续创作的最大动力!

标签:10,123,洛谷,NOIP2011,反转,sum,样例,P1307,000
From: https://blog.csdn.net/2301_80147864/article/details/143925068

相关文章

  • 洛谷 P11210 强制在线动态二维数点
    题目传送门题目中的点满足\(y\lex\),那么不妨把每个点看成区间\([y,x]\)。那么题目相当于要求维护若干个区间,支持修改,以及查询询问区间中区间长度的最小值。从“区间长度的最小值”入手。显然包含别的区间的区间不能成为答案。排除了这样的区间,剩下区间按左端点升序排序,则右端......
  • 洛谷 P1613 跑路 做题记录
    前置芝士:最短路、floyd传递闭包、倍增思路看到题目里面的一次能走\(2^k\)千米,我们联想到倍增,因为只能用跑路器。我们枚举\(k\),然后做一次传递闭包,\((i,j)\)走\(2^k\)千米是相连的,当且仅当有一个点\(k\)是的\((i,k),(k,j)\)可以通过走\(2^{k-1}\)千米相连。此时,\((......
  • 【题解】洛谷:P8593 「KDOI-02」一个弹的投
    P8593「KDOI-02」一个弹的投物理题。首先你要搞懂什么时候会炮弹碰撞,结论:y坐标相同时,水平位置\(x_i\lex_j\)且落点满足\(d_i\ged_j\),两炮弹必然碰撞。但是为什么呢,像我这种完全没学高中物理的伪高中生就不会了,下落时每个物体的相对的高度差是不变的,因为根据伽利略运动独......
  • 【洛谷】P1914 小书童——凯撒密码
    题目背景某蒟蒻迷上了“小书童”,有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你。题目描述蒟蒻虽然忘记密码,但他还记得密码是由一个字符串组成。密码是由原文字符串(由不超过50个小写字母组成)中每个字母向后移动 n 位形成的。z 的下一个字母是 ......
  • 洛谷题单指南-二叉堆与树状数组-P2161 [SHOI2009] 会场预约
    原题链接:https://www.luogu.com.cn/problem/P2161题意解读:本题前面形式化描述已经足够清晰。解题思路:要判断线段之间是否有冲突(包含或者交叉),可以借助set,参考:https://www.cnblogs.com/jcwy/p/18447333只不过这里要统计冲突的数量,也就是允许相等的元素重复存在,可以借助multiset......
  • 洛谷:P1008 [NOIP1998 普及组] 三连击
    这道题需要我们找出所有符合要求的数对,由于数据量不大,这里我们可以使用枚举的方法进行枚举,那么我们从最小的三位数100到最大数999进行遍历寻找,再对这三个数进行判断,判断这三个数的每一位是否由1-9这9个数组成,且每个数只出现一次。在判断这个地方我们可以用一个数组来进行计数,将......
  • 洛谷题单指南-二叉堆与树状数组-P5677 [GZOI2017] 配对统计
    原题链接:https://www.luogu.com.cn/problem/P5677题意解读:所谓好的配对,通过分析公式∣ax−ay∣≤∣ax−ai∣(i≠x),可以得知就是一个ax与其差的绝对值最小的形成的配对,在数轴上就是距离ax最近的点ay,配对是下标(x,y),给定若干个区间[l,r],每个区间的配对数*区间编号的累加。解题思路:......
  • 【题解】洛谷:P4805 [CCC2016] 合并饭团
    P4805[CCC2016]合并饭团希望写完这篇题解能真正地会这种题。合并两个的操作很像合并石子的操作,确实直接那么做就可以,但三个怎么办呢,暴力做法就是枚举中间两个端点然后转移,但是这样复杂度太大了有\(O(n^4)\)。于是搬出我们的双指针,在面对区间问题时双指针可以有效地解决问题,......
  • P1314 [NOIP2011 提高组] 聪明的质监员
    题目[NOIP2011提高组]聪明的质监员题目描述小T是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有n个矿石,从1到n逐一编号,每个矿石都有自己的重量wi以及价值vi。检验矿产的流程是:给定m个区间[li,ri];选出一个参数W;对于一个区间[li,ri],计算矿石在这......
  • 洛谷P1816忠诚
    洛谷P1816忠诚思路查询区间最小值,\(ST\)表/线段树板子题代码#include<bits/stdc++.h>#defineendl'\n'#defineintlonglongconstintmaxn=2e5+5;constintinf=0x7f7f7f7f;structcustom_hash{ staticuint64_tsplitmix64(uint64_tx){ x^=......