三位数反转问题易被忽略的两大细节

【题目描述】

输入一个三位数,分离出它的百位、十位和个位,反转后输出。

【样例输入】

127

【样例输出】

721

这个问题并不难,只需要两步:

①将这个三位数分离成三个数字(参见“整数的分离与合成”一文);

②反转三个数字的顺序输出。

代码如下:

#include<stdio.h>int main(){int n;scanf("%d", &n);printf("%d%d%d\n", n%10, n/10%10, n/100);return 0;}

不过这里面有两个容易被忽略的问题却值得讨论一下:

(1)-127是三位数吗?012呢?

数学中的定义:“位数”指一个自然数数位的个数,而“数位”是指一个数的每个数字所占的位置。

所以,我们说“n位数”就说明这个数首先是一个自然数,自然数(0和正整数)是用来表示自然界物体个数的数。-127不是自然数,也自然就不是三位数。

注意,以上结论完全是根据数学中“位数”的定义得来的,在算法竞赛中这样处理也是没问题的。

但是现实中你若没和人家提到负数,别人一般都想不到负数这回事,而一旦你提到了,他们可能就会忽然显现出一种豁然开朗的神情,大呼:“对呀,还得考虑负数的情况!”

你要是和他解释上面的数学定义,那他会不屑地反问:“那你说-127不是三位数是几位数?”

这句话会让你哑口无言(老金的儿子就是这样反问老金的,他对-127是三位数深信不疑。老金答不上他的问题,只好说让他去问老师)。

而012根本不是一个数,更不用谈是不是三位数了,因为数的最高位不能为0。

(2)数的最高位不能为0

“最高位不能为0”看似一句废话,但却经常被人忽略,甚至这道题本身就忽略了这一因素。

如果输入的三位数个位是0,反转后这个0要不要输出?比如,输入520,是要输出025还是25?因此这道题本身是不严谨的。

如果在算法竞赛中遇到这样的问题,可向监考人员询问,但在考试这种环境下,多半是无果的。

如果得不到回音,题还是要做的,这就要自己去分析:因为出题老师忽略了这个因素,就意味着可以对这个问题忽略不计,那就只管反转这三个数字就好了,不要考虑原数尾部是0的问题。

假如出题老师没有忽略这个问题,而且还有意在此设坑,他会怎么出题呢?

只需要对输出要求做一点小小的更改:把“反转后输出”改为“输出反转后的数。”

因为现在要求输出的是“数”,那么最高位肯定不能为0了,否则就不是“数”了。

修正后的问题怎么解呢?

如果不考虑对0的处理,整个程序可分为4步:输入、分离、反转、输出,这四步中,分离和反转都属于中间的“处理”环节。

分离和反转是对数的形式变换(不改变内容),而结果最高位不能为0是属于对数的内容的取舍。所以这种取舍过程应该放在生成结果之后,也就是放在反转之后。它有两个位置:输出前、输出时。

但其实还有另外一个思路,就是在输入之后、处理之前就对输入的数据进行预处理,去除数字尾部的所有零。这就像滤波器一样,滤掉数字的噪声。

所以,应记住对生成结果的处理可以放在以下三个环节:

①输入后;

②输出前;

③输出时。

1. 输入后:去除尾部所有0

首先,去除原数尾部所有0。比如输入520,500,在未分离、反转前就将尾部所有的0去掉,让其变为52、5,这样就保证了最后的结果最高位不是0。

然后,将去除尾部0的数反转输出。

程序如下:

#include<stdio.h>int main(){int n, m;scanf("%d", &n);//去除尾部所有0while(n%10 == 0){n /=10;}//利用“去尾法”反转输出while(n>0){printf("%d", n%10);n/=10;}printf("\n");return 0;}

上述代码用了两个while循环,看起来有些难理解,但说到底无非还是用了%、/这两个运算符的两个功能:n%10:求尾数,n/10去尾数。

去除原数尾部所有0的方法:用n%10判断尾部的数是否为0,如果是0就用n/10去掉尾部数字。

将去除尾部0的数反转输出,正是利用了“取尾法”实现了整数的分离和反转(详见“整数的分离与合成”一文)。

这个程序的优点是适用范围广,几位数都可以。

2. 输出前:把反转结果转化为一个真正的数。

这种方法是在输出前把结果转化成一个整数,并存储在变量中。这样,直接用%d格式输出变量,最高位就不会再输出0。

#include<stdio.h>int main(){int n, m;scanf("%d", &n);m = n%10*100 + n/10%10*10 + n/100;printf("%d\n", m);return 0;}

当然了,想要补上0也是可以的,只要把上面输出语中的%d改为%03d即可。即改成:

printf("%03d\n", m);

注:3代表输出的数要有3个数字,前面的0代表不满3个前面补0。

3. 输出时:根据条件选择性输出

思路很直接,就是在输出时加入判断。即依次检查要输出的数字的值,直到不为0时才开始输出。

#include<stdio.h>int main(){int n, units, tens, hundreds;scanf("%d", &n);units = n%10;// 获取个位tens = n/10%10;// 获取十位hundreds = n/100;// 获取百位if(units != 0){printf("%d%d%d\n", units, tens, hundreds);} else if(tens !=0){printf("%d%d\n", tens, hundreds);} else{printf("%d\n", hundreds);}return 0;}

以上就是反转后去除高位0的三种方法,其中第1种代码理解相对有一定难度,不容易想到,但是适用范围广;第2、3种理解起来比较容易,但适用范围窄。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/509643.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内核中的Kconfig文件

Kconfig解析 编译内核时用于配置的Kconfig文件 以内核中的ttyprintk.c为例&#xff0c;其位于/kernel-sources/dirver/char/ttyprintk.c 如何将其编译进内核&#xff1f; 在char目录下有Kconfig文件&#xff0c;其中有如下内容 tristate 表示该模块可以选择 Y N M(以.ko形…

【物联网应用案例】从0到N,智慧农业的数据价值

智慧农业全方位渗透到农业的每一个环节&#xff0c;云端解决方案更推动了研究人员、农艺师及农民间的密切协作&#xff0c;为研发企业提供了既经济又具扩展性的完美方案。 据IDC预计&#xff0c;到2036年&#xff0c;农场收集的数据量将增加800%以上&#xff0c;这凸显了农业数…

从零开始手写RPC框架(4)

这一节主要讲述网络传输模块的代码&#xff0c;并且几乎每一行代码都加上了我个人理解的注释&#xff0c;同时也讲述了其中一些以前没见过的函数&#xff0c;和大致的底层运行逻辑。 目录 网络传输实体类网络传输实现基于Socket实现网络传输基于Netty实现网络传输客户端服务端 …

java 从环境变量中获取参数及值

window直接在这设置&#xff1a; linux在/etc/profile文件里存放&#xff1a; export keyvalue 然后立即生效&#xff1a;source /etc/profile 代码获取值这样获取&#xff1a; System.getenv("key");

windows环境下Grafana+loki+promtail入门级部署日志系统,收集Springboot(Slf4j+logback)项目日志

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

萌新学习RSA第二天(离线分解整数N)

1.yafu的使用&#xff08;离线环境分解N&#xff09;、 下载 打开 及使用 下载地址&#xff1a;https://sourceforge.net/projects/yafu/ 在下载好的并解压好的文件夹上鼠标右键打开终端 然后输入.\yafu-x64.exe并回车运行 .\yafu-x64.exe 来到这个页面就OK了 然后输入 fa…

基于Mahout实现K-Means聚类

需求分析 需要对数据集进行预处理&#xff0c;选择合适的特征进行聚类分析&#xff0c;确定聚类的数量和初始中心点&#xff0c;调用Mahout提供的K-Means算法进行聚类计算&#xff0c;评估聚类结果的准确性和稳定性。同时&#xff0c;需要对Mahout的使用和参数调优进行深入学习…

关于拖拽功能

文章目录 写在前面自己手动实现拖拽的demo技术细节&#xff1a;Js中拖拽(拉)事件&#xff08;drag 和 drop&#xff09;浏览器兼容性拖拽Api的介绍拖拽流程1.dragstart事件2.dragenter事件3.dragover事件4.drop事件(必须要dragover事件触发)5.dragend事件MDN关于拖拽的解析 相关…

STM32(6)中断

1.中断 1.1 中断的概念 STM32的中断&#xff1a; 1.2 中断优先级 用数字的大小表示中断优先级的高低&#xff0c;数字的范围&#xff1a;0000--1111&#xff08;二进制&#xff09;&#xff0c;即0-15&#xff0c;共16级优先级。 进一步对这4位二进制数进行划分&#xff0c;可…

嵌入式Qt 对话框及其类型 QDialog

一.对话框的概念 对话框是与用户进行简短交互的顶层窗口。 QDialog是Qt中所有对话框窗口的基类。 QDialog继承与QWidfet是一种容器类型的组件。 QDialog的意义&#xff1a; QDialog作为一种专业的交互窗口而存在。 QDialog不能作为子部部件嵌入其他容器中。 QDialog是定制…

基于单片机的高精度心理测试仪设计

0 前言 随着社会的不断发展,人们的物质文化生活水平也随之不断提高,但在满足个人需求的同时,心理健康问题也不断出现,且趋于更加严峻的形势。因此,做好日常的心理监测既能够将心理健康问题扼杀在源头处,又能够提醒测试者及时进行状态的调整。当前的心理测试方法众多,主要通过…

转转测试环境docker化实践

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程&#xff0c;一周学完让你面试通过率提高90%&#xff01;&#xff08;自动化测试&#xff09; 测试环境对于任何一个软件公司来讲&#xff0c;都是核心基础组件之一。转转的测试环境伴随着转转的发展也从单一的几…