数字位数不确定时,如何反转呢?

本文为博客园ShyButHandsome原创作品,转载请注明出处

使用右侧目录快速浏览文章

题目描述

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

新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零

输入格式

一个整数\(N\)。

输出格式

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

说明/提示

\(-1,000,000,000 \leq N \leq 1,000,000,000\) 。

分析

这题虽然给出了\(N\)的范围,但并没有给出确定的位数

没有说是一位数、两位数或者是三位数

如果给出位数那倒好办了int hun, ten, sig一气呵成

(可以将给出位数的每一位都用一个变量来储存,实在不行开个数组)

假如没有给出范围,你不知道该开多大的数组,怎么办?

  • 方法一:给他一个无法拒绝的理由

    注:"给他一个无法拒绝的理由"——《教父》中的"经典台词"

    既然我不知道开多大,那我就使劲开咯

    开一个超级大的数组,每一个元素对应一位

    如:int very_very_big[9999999] // 记得开在函数外

    但这样就造成了"假想无穷大"

    真遇上奇葩数据得凉

  • 方法二:"临时"和"总"

    使用一个变量临时地储存每一位

    然后在循环外定义一个变量用来累加(累乘)

    只要每次在存入当前这位数时

    将这个定义在循环外的变量 \(\times 10\)。

    来腾出一个"个位"给当前这位数就可以了

    比如:

    现在给你一个数(这是一个数,我用空格分开了每一位,方便观察)

\[ 3 \quad \color{red}{\huge 4}
\]

        int new_num = 0;
now = 4;
new_num = new_num * 10 + now // new_num = 0 * 10 + 4 = 4

\[ \color{red}{\huge 4}
\]



\[ \color{red}{\huge 3} \quad 4
\]

        now = 3;
new_num = 4 * 10 + 3;

\[ 4 \quad \color{red}{\huge 3}
\]

但,似乎还有个问题

我不知道有多少位数,那我的循环怎么结束?

遇到循环次数不确定时

我们首先要考虑while()循环

但无论是什么循环,都需要找到一个跳出循环的条件

那,什么样的条件合适呢?

标志flag,就是一个合适的条件

flag 无特殊含义

当达到临界条件时,这个flag会改变

flag就两种类型true or flase

不要去关注它的值

  • 比如:

    • 从\(1\)到\(9\)

      for (int i = 1; i <= 9; i++)

    i > 9时,flag倒下,条件不成立

你乍一看可能觉得我这是废话,其实不然

只是这种计时器类型的临界条件比较好找罢了

你不用去找别的,答案十分明确

但,别的类型呢?

关键就是要找,达到成你目的时会变化的flag

就像CE找地址

CE: Cheat Engine的缩写,一款非常优秀的内存地址查找软件

你通过不断改变值,总能找到你想要的那个地址

CE这里的flag就是随着值变动而变动为正确值

比如:

- 你把那个值改为了\(123\)

- 地址列表中没有改变的值、或者变化后值不是\(123\)的值就会被剔除

不满足条件则出局out

这是排除法

好的,那么问题来了

现在给你一个数(这是一个数,我用空格分开了每一位,方便观察)

\[1 \quad 2 \quad 3 \quad 4 \quad 5 \quad 6 \quad 7 \quad 8 \quad \color{red}{\huge 9}
\]

现在位数是\(9\)。

指向\(9\)。

从\(9\)到\(1\)。

从\(1\)到\(9\)。

每次到最高位/最低位的距离都在变化

那只要让距离最高位/最低位的距离一定

就改变了距离到最高位/最低位的距离改变这个flag

欸,别忘了前导零的存在!

这玩意你加多少个都没问题

而当你指向前导零时

你到最高位/最低位的距离都是不变的

欧耶!条件找到了!

最终指向前导零的时候就是到达了最高位

可是问题又来了,这个指向每一位的操作怎么模拟?

指向每一位的操作可以/10%10来模拟

对一个整形/10可以减少一位

%10可以取出最低位

特别说明:%

根据在C++中取余运算的定义:

如果\(m\)和\(n\)是整数且\(n \neq 0\)。

则表达式\((m/n)*n + m%n\)的运算结果与\(m\)相等

隐含的意思是:如果\(m%n \neq 0\),则它的符号与\(m\)相同。

除了\(-m\)导致的溢出的特殊情况外,

其他时候

m % (-n) = m % n
(-m) % n = -(m % n)

也就是说,你可以不用担心负数的问题了

那,如何指向一位位地指向前导零呢?

因为每次/10距离都会减少一位

所以当数字长度不断减小直到为\(0\)时,此时指向前导零

即,已经从低到高一位位地遍历了整个数

任务完成,退出循环!

代码实现

// 来源:自己写的
// 作者:@ShyButHandsome
#include<bits/stdc++.h>
using namespace std; int main(void)
{
long long num;
cin >> num; long long new_num = 0;
int n = 1; int count = 0;
while(num)
{
int each_bit = num % 10;
new_num = new_num * 10 + each;
num /= 10;
} cout << new_num; return 0;
}

总结

这样思考下来

我们收获了什么?

  1. 将一个定义域内变量累加到定义域外的思想
  2. flag的选择
  3. %的使用和/一样,是带号的

参考资料

《C++ Primer》

我是ShyButHandsome,一个名字与实际截然相反的OI蒟蒻,如果你觉得这篇文章写的还行的话,不妨点点推荐?

数字反转 NOIp普及组2011的更多相关文章

  1. [NOIP普及组2011]装箱问题

    目录 链接 博客链接 题目链接 题目内容 题目描述 格式 输入 输出 样例 输入 输出 前缀知识 题解 题目名称:装箱问题 来源:2011年NOIP普及组 链接 博客链接 CSDN 洛谷博客 题目链接 ...

  2. [NOIp普及组2011]瑞士轮

    洛谷题目链接:瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较 ...

  3. 2016.9.3初中部上午NOIP普及组比赛总结

    2016.9.3初中部上午NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1339 这次真爽,拿了个第四!(我还被班主任叫过去1小时呢!) 进 ...

  4. 2016.10.7初中部上午NOIP普及组比赛总结

    2016.10.7初中部上午NOIP普及组比赛总结 这次的题还可以,重新入了比赛的前十. 进度: 比赛:90+10+70+30=200 改题:AC+AC+AC+AC=AK 找试场 这题很简单,但是被欺 ...

  5. 2016.10.6初中部上午NOIP普及组比赛总结

    2016.10.6初中部上午NOIP普及组比赛总结 中了病毒--病毒--病毒-- 进度: 比赛:AC+0+0+20=120 改题:AC+0+AC+20=220 Stairs 好--简--单!递推就过了 ...

  6. 2016.9.24初中部上午NOIP普及组比赛总结

    2016.9.24初中部上午NOIP普及组比赛总结 2016.09.24[初中部 NOIP普及组 ]模拟赛 其实这次我没比赛,早上去参加亲子活动去了. 不过在下午我做完了所有的题,感觉还好. 进度 现 ...

  7. 2321. 【NOIP普及组T1】方程

    2321. [NOIP普及组T1]方程 时间限制: 1000 ms  空间限制: 262144 KB 题目描述

  8. [NOIP普及组2001]最大公约数和最小公倍数问题

    目录 链接 博客链接 题目链接 题目内容 题目描述 格式 输入 输出 数据 样例 输入 输出 说明 题目名称:最大公约数和最小公倍数问题 来源:2001年NOIP普及组 链接 博客链接 CSDN 洛谷 ...

  9. 2016.8.15上午纪中初中部NOIP普及组比赛

    2016.8.15上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1333 这次比赛不怎么好,因为这套题目我并不是很擅长. 可同学们 ...

随机推荐

  1. 项目页面集成ckeditor富文本编辑器

    步骤一.引入ckeditor.js (注:本实例以ThinkPHP3.2框架为载体,不熟悉ThinkPHP的朋友请自行补习,ckeditor文件代码内容也请去ckeditor官网自行下载) 作为程序员 ...

  2. springboot 解决实体类值为null或者数组为空,不返回前台

    一个注解解决问题 @JsonInclude(JsonInclude.Include.NON_EMPTY) @JsonInclude(JsonInclude.Include.NON_NULL)

  3. java网络编程——socket实现简单的CS会话

    还记得当年学计网课时用python实现一个简单的CS会话功能,这也是学习socket网络编程的第一步,现改用java重新实现,以此记录. 客户端 import java.io.*; import ja ...

  4. 利用virtualenvwrapper创建虚拟环境出现错误“/usr/bin/python: No module named virtualenvwrapper”

    Linux:CentOS7 python: 系统默认python版本2.7,利用python启动 自己安装python版本3.8,利用python3启动 问题描述: 在上述环境中利用virtualen ...

  5. c语言之学生管理系统

    0x00 学生管理系统 说到学生管理系统,对于每一个初学c语言的人都是一道不得不过的砍.不过,学习c,我觉得每个人都应该写一个学生管理系统,至于为什么,我想倘若连一个学生管理系统都写不好,哪么他的c是 ...

  6. 细说集群技术(Cluster)

    今天本人给大家讲解一些我对集群技术一个理解,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 集群(Cluster)技术:通过此可以用较低的成本获取较高的性能 ...

  7. 使用R进行空间自相关检验

    「全局溢出」当一个区域的特征变化影响到所有区域的结果时,就会产生全局溢出效应.这甚至适用于区域本身,因为影响可以传递到邻居并返回到自己的区域(反馈).具体来说,全球溢出效应影响到邻居.邻居到邻居.邻居 ...

  8. 必备技能六、Vue中实现全局方法

    现实背景:很多时候我们会在全局调用一些方法. 实现方式两种:官网的实现use方法,然后你也可以用野路子直接在Vue.prototype上面定义. 先说野路子,因为其实野路子就是最根本的实现方式,官方的 ...

  9. django 博客搭建

    comment1.安装django pip install django 2.创建项目 django-admin startproject mysite 3.在mysite文件夹下创建app pyth ...

  10. ggplot2(3) 语法突破

    3.1 简介 图形图层语法基于Wilkinson的图形语法,并在其基础上添加了许多新功能,使得图形更有表现力,并能完美地嵌入到R的环境中. 图形图层语法使得图形的重复更新变得简单——每次只更新一个特征 ...