数字反转 NOIp普及组2011
当数字位数不确定时,如何反转呢?
本文为博客园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\)。
来腾出一个"个位"给当前这位数就可以了
比如:
现在给你一个数(这是一个数,我用空格分开了每一位,方便观察)
\]
int new_num = 0;
now = 4;
new_num = new_num * 10 + now // new_num = 0 * 10 + 4 = 4
\]
\]
now = 3;
new_num = 4 * 10 + 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
这是排除法
好的,那么问题来了
现在给你一个数(这是一个数,我用空格分开了每一位,方便观察)
\]
现在位数是\(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;
}
总结
这样思考下来
我们收获了什么?
- 将一个定义域内变量累加到定义域外的思想
flag的选择%的使用和/一样,是带号的
参考资料
《C++ Primer》
我是ShyButHandsome,一个名字与实际截然相反的OI蒟蒻,如果你觉得这篇文章写的还行的话,不妨点点推荐?
数字反转 NOIp普及组2011的更多相关文章
- [NOIP普及组2011]装箱问题
目录 链接 博客链接 题目链接 题目内容 题目描述 格式 输入 输出 样例 输入 输出 前缀知识 题解 题目名称:装箱问题 来源:2011年NOIP普及组 链接 博客链接 CSDN 洛谷博客 题目链接 ...
- [NOIp普及组2011]瑞士轮
洛谷题目链接:瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较 ...
- 2016.9.3初中部上午NOIP普及组比赛总结
2016.9.3初中部上午NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1339 这次真爽,拿了个第四!(我还被班主任叫过去1小时呢!) 进 ...
- 2016.10.7初中部上午NOIP普及组比赛总结
2016.10.7初中部上午NOIP普及组比赛总结 这次的题还可以,重新入了比赛的前十. 进度: 比赛:90+10+70+30=200 改题:AC+AC+AC+AC=AK 找试场 这题很简单,但是被欺 ...
- 2016.10.6初中部上午NOIP普及组比赛总结
2016.10.6初中部上午NOIP普及组比赛总结 中了病毒--病毒--病毒-- 进度: 比赛:AC+0+0+20=120 改题:AC+0+AC+20=220 Stairs 好--简--单!递推就过了 ...
- 2016.9.24初中部上午NOIP普及组比赛总结
2016.9.24初中部上午NOIP普及组比赛总结 2016.09.24[初中部 NOIP普及组 ]模拟赛 其实这次我没比赛,早上去参加亲子活动去了. 不过在下午我做完了所有的题,感觉还好. 进度 现 ...
- 2321. 【NOIP普及组T1】方程
2321. [NOIP普及组T1]方程 时间限制: 1000 ms 空间限制: 262144 KB 题目描述
- [NOIP普及组2001]最大公约数和最小公倍数问题
目录 链接 博客链接 题目链接 题目内容 题目描述 格式 输入 输出 数据 样例 输入 输出 说明 题目名称:最大公约数和最小公倍数问题 来源:2001年NOIP普及组 链接 博客链接 CSDN 洛谷 ...
- 2016.8.15上午纪中初中部NOIP普及组比赛
2016.8.15上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1333 这次比赛不怎么好,因为这套题目我并不是很擅长. 可同学们 ...
随机推荐
- 如何用Postman做接口自动化测试
目录 前言 什么是自动化测试 自动测试测试分类 为什么需要自动化测试 Postman自动化测试演示 1.新建集合 2.新建接口 3.填写自动化测试脚本 4.录入所有接口 5.执行自动化测试 前言 什么 ...
- Windows激活服务器搭建
1.下载服务端的安装包,下载地址: https://github.com/Wind4/vlmcsd/releases 注意,下载编译好的包省时间,名称为:binaries.tar.gz 或者直接下载我 ...
- 常用css3选择器
<div class="wrapper"> <p class="test1">1</p> <p class=" ...
- D3.js实现拓扑图
最近写项目需要画出应用程序调用链的网路拓扑图,完全自己写需要花费些时间,那么首先想到的是echarts,但echarts的自定义写法写起来非常麻烦,而且它的文档都是基于配置说明的,对于自定义开发不太方 ...
- [LeetCode] 面试题59 - II. 队列的最大值
题目: 分析: 本题要求三个方法的时间复杂度都是O(1),对于push_back和pop_front都是好实现的 但是对于max_value,正常情况下要进行遍历才能获得最大值,那么如何才能在O(1) ...
- 02 HDFS 分布式环境实战
HDFS的主要设计理念 1.存储超大文件 这里的“超大文件”是指几百MB.GB甚至TB级别的文件. 2.最高效的访问模式是 一次写入.多次读取(流式数据访问)3.运行在普通廉价的服务器上 HDFS设计 ...
- Vue2.0 【第一季】第1节 走进我的Vue2.0
目录 Vue2.0 [第一季]内部指令 第一节 走进我的Vue2.0 Vue2.0 [第一季]内部指令 记录一下我的代码地址:D:/Code/Vue 编辑器:VS code 前置知识: 1.HTML的 ...
- BrowserSync(前端利器—保存代码后,自动刷新浏览器)
摘要 Browsersync能让浏览器实时.快速响应您的文件更改(HTML.JavaScript.CSS.Sass.Less.PHP.Python等)并自动刷新页面.更重要的是 Browsersync ...
- h5微信中视频禁止全屏
<video id="videoPlayer" v-show="isShowVideo" class="video" ref=&quo ...
- (转)协议森林07 傀儡 (UDP协议)
协议森林07 傀儡 (UDP协议) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们已经讲解了物理层.连接层和网络层.最开始的 ...