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

【题目描述】

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

【样例输入】

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);



    //去除尾部所有0

    while(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种理解起来比较容易,但适用范围窄。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

lv20 QT事件5

1 事件模型 2 事件处理 virtual void keyPressEvent(QKeyEvent *event) virtual void keyReleaseEvent(QKeyEvent *event) virtual void mouseDoubleClickEvent(QMouseEvent *event) virtual void mouseMoveEvent(QMouseEvent *event) virtual void mousePressEvent(QMou…

【大厂AI课学习笔记NO.59】(12)过拟合与欠拟合

拟合就是调整参数和模型&#xff0c;让结果无限接近真实值的过程。 我们先来了解个概念&#xff1a; 偏差-方差窘境&#xff08;bias-variance dilemma&#xff09;是机器学习中的一个重要概念&#xff0c;它涉及到模型选择时面临的权衡问题。 偏差&#xff08;Bias&#xf…

自建Redis蜜罐以捕获和分析潜在攻击

一、引言 随着网络攻击的日益频繁和复杂&#xff0c;传统的防御措施往往难以应对。蜜罐作为一种主动防御技术&#xff0c;通过模拟有价值的服务来吸引攻击者&#xff0c;从而收集和分析攻击数据&#xff0c;提高网络安全性。本文将介绍如何自建一个Redis蜜罐&#xff0c;以捕获…

转转测试环境docker化实践

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

【开源】JAVA+Vue.js实现农家乐订餐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户2.2 管理员 三、系统展示四、核心代码4.1 查询菜品类型4.2 查询菜品4.3 加购菜品4.4 新增菜品收藏4.5 新增菜品留言 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的农家乐订餐系统&#xff0c…

MS1030超声波流量高精度测量电路

产品简述 MS1030 是一款针对超声波流量高精度测量电路&#xff0c;它具有高 精度&#xff0c;高稳定性&#xff0c;高效率的特点。它的测量精度 15ps &#xff0c;测量范 围 500ns  4ms4MHz 。在第一波模式情况下&#xff0c;内部比较器的 offset 可编程范围为 127…

type.GetFields() 获取不到,改用type.DeclaredFields

StatisticQuery 类 private Dictionary<string, DateTime> GetTBHBDate(StatisticQuery model, string field){Dictionary<string, DateTime> dic new Dictionary<string, DateTime>();DateTime TB new DateTime();//同比开始日期 &#xff08;年&#xff…

计网面试题整理下

1. HTTP常见的状态码有哪些&#xff1f; 常见状态码&#xff1a; 200&#xff1a;服务器已成功处理了请求。 通常&#xff0c;这表示服务器提供了请求的网页。301 &#xff1a; (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时&am…

揭秘测试工程师的6大必备技能!你也常遇到这个问题吗?

作为一名Tester&#xff0c;无论是面试还是工作&#xff0c;我们都常常会遇到该问题&#xff0c;毕竟现在大部分接手的项目都是中小型的项目&#xff0c;很多又是生疏行业的系统&#xff0c;所以这个问题就会常常伴随我们&#xff0c;那么遇到这个问题该怎么办呢&#xff0c;现…

淘宝1688京东商品采集API接口系列,item_get-获得淘宝商品详情

请求示例&#xff0c;API接口接入Anzexi58 商品采集API接口系列 商品搜索API&#xff1a; 功能&#xff1a;根据关键词、分类、价格范围等条件搜索商品。参数&#xff1a;关键词、分类ID、价格范围、品牌等。返回&#xff1a;商品列表&#xff0c;包括商品ID、名称、价格、图片…

【C++练级之路】【Lv.10】【STL】priority_queue类和反向迭代器的模拟实现

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C语言》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 一、仿函数1.1 仿函数的介绍1.2 仿函数的优势 二、priority_queue2.1 push2.2 pop2.3 top2.4 size2.5 empty 三、…

[Java 探索之路~大数据篇] 新时代大数据流处理入门指南

本文主要介绍大数据基础&#xff0c;以及 flink 流计算 文章目录 【基础知识】1. 批处理与流处理1.批处理2.流处理 2. 为什么需要一个优秀的流处理框架1. 股票交易的业务场景2.生产者——消费者模型3. 流处理框架要解决的诸多问题&#xff08;1&#xff09;可扩展性&#xff08…

自定义View中的ListView和ScrollView嵌套的问题

当我们在使用到ScrollView和ListView的时候可能会出现显示不全的问题。那我们可以进行以下分析 ScrollView在测量子布局的时候会用UNSPECIFIED。通过源码观察&#xff0c; 在ScrollView的onMeasure方法中 Overrideprotected void onMeasure(int widthMeasureSpec, int heightMe…

C++ 类的大小 原理+详细计算示例

大小的组成 类的大小受&#xff1a;基类&#xff0c;成员&#xff0c;虚基表指针&#xff0c;虚函数表指针 影响。 计算方式 需要按照下列要素对齐和规则计算对齐&#xff1a; 对齐要素 编译器默认对齐数 根据环境改变&#xff0c;一般32位为4&#xff0c;64位为8。 有效…

KMP算法模板

KMP算法模板 自用&#xff0c;相关题解参考

电瓶车充电安全谈|南京小区15死44伤火灾背后的思考

今年2月23日&#xff0c;南京雨花台区明尚西苑居民楼发生了一起重大火灾事故&#xff0c;在事故中&#xff0c;共有59人受到不同程度的伤害&#xff0c;遇难的有15人&#xff0c;另有44人在医院接受治疗。 南京雨花台区火灾的发生无疑是一场令人痛心的悲剧&#xff0c;这场事故…

如何在 Linux 中快速清空文件而不删除它们?

在Linux系统中&#xff0c;清空文件而不删除它们是一种常见的需求&#xff0c;特别是在需要保留文件结构或权限的情况下。本文将详细介绍如何在Linux环境中快速清空文件内容的多种方法&#xff0c;以及每种方法的优缺点。清空文件通常涉及到文件内容的擦除&#xff0c;但并不涉…

【MySQL】事务管理 -- 详解

一、前言 CURD 不加控制&#xff0c;会有什么问题&#xff1f; CURD 满足什么属性&#xff0c;能解决上述问题&#xff1f; 买票的过程得是原子的。买票应该不能受互相的影响。买完票应该要永久有效。买前和买后都要是确定的状态。 什么是事务&#xff1f; 事务就是一组 DML…

DCTNet

DCTNet http://giantpandacv.com/academic/%E7%AE%97%E6%B3%95%E7%A7%91%E6%99%AE/%E9%A2%91%E5%9F%9F%E4%B8%AD%E7%9A%84CNN/CVPR%202020%20%E5%9C%A8%E9%A2%91%E5%9F%9F%E4%B8%AD%E5%AD%A6%E4%B9%A0%E7%9A%84DCTNet/ 一个对输入图像进行频域转换和选择的方法&#xff0c;达到…

Timeout while connecting to “172.168.252.245:161

Timeout while connecting to “172.168.252.245:161” 现象 排查过程 交换机型号H3C&#xff0c;交换机采用SNMPV3协议对接zabbix&#xff0c;交换机配置如下 snmp-agent sys-info version all snmp-agent group v3 zabbix_group privacy read-view isoview snmp-agent …