「浙江理工大学ACM入队200题系列」问题 H: 零基础学C/C++18——三位数反转
本题是浙江理工大学ACM入队200题第二套中的H题
我们先来看一下这题的题面.
由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习惯,尤其是要利用好输入和输出样例.
- 样例相当于给你举了个具体的例子,可以帮助你更好的理解题目
- 样例会告诉你输入和输出的格式,你必须要在程序里以这样的格式输入和输出,否则会出问题
- 样例可以在你本地写完代码之后用作测试,来检查你的代码能否正常地运行(不过样例运行正确并不代表完全对了,可能输入其他的数据会出现别的问题)
题面
题目描述
输入1个3位数,分离出它的百位、十位和个位,反转后输出
输入
输入1个3位整数
输出
输出3位整数的反转数
样例输入
250
样例输出
052
提示
分离出各位数字可以用取余和除数
注意在C语言里,2个整数相乘除结果还是整数 比如8/3在C语言里结果是2
取余采用符号%
比如8%3的结果应该是2即8除以3后的余数
题目分析
想要倒序输出3位数,首先我们必须取出这个三位数中的各个位,而这题对于新朋友们来说最难的点可能是取出数字中的各个位了,不过好在仁慈的叶教给出了提示.
我们可以通过对10取余来得到当前数字的个位,对10整除取得当前数字去掉最后一位(即十进制位右移一位)后的数字:
(图片有错别字,左边"正数"应为"整数")
同理也可推出对100取余、对100整除等操作的效果,取n进制的某一位同样也可使用类似的操作完成.
所以对于这题我们只需要通过上述操作的组合取出各个位上的数字,再将其反过来输出即可.
取出各个位上的数字的局部参考代码如下:
int a = n / 100; // 取出百位(如果实在不能直接理解,可看成先/10去掉个位变为两位数(如250->25),再/10去掉新的个位变为1位数(如25->2),这样就是百位了)
int b = n / 10 % 10; // 取出十位(先去/10掉个位(250->25),再取%10新的个位,即十位)
int c = n % 10; // 取出个位
常见错误思路
解决了上述的难点之后,有些朋友们就掉坑了.这题的一个坑点就出现在倒序输出上,不过好在可以直接通过样例输入发现这个问题.
这些朋友们的倒序输出的思路是这样的,既然我可以反着十进制的规则取出各个十进制位,那我也可以正着十进制的规则算出倒过来的数,于是他们写出了如下的代码(局部)
int res = c * 100 + b * 10 + a; // 根据十进制的定义求出倒序后的十进制数
常见错误原因解析
这样写在数学上确实没什么大问题,但是注意看这里的输出样例,我们的程序需要实现的是250->052而不是250->52,也就是说在这道题里,不能通过算出倒序后的数这种方式来解决,因为对于一个数字而言,首位的0是会省略的(如果题目要求要没有首位0,那确实可以这么写,因题而异).
这里就体现出了仔细看输入和输出样例的重要性了吧!各位朋友们一定要仔细耐心看题哦!
解决方案
那怎么办呢,很简单鸭,直接一个一个数字输出不就好了嘛(本质是字符串拼接),局部参考代码如下:
printf("%d%d%d", c, b, a); // 将三个位按逆序逐个输出
参考代码
下面给出了我自己做这道题时候的完整代码:
(仅作为参考,一定要自己写一下奥,作弊没意思,害人又害己)
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int a = n / 100; // 取出百位(如果实在不能直接理解,可看成先/10去掉个位变为两位数(如250->25),再/10去掉新的个位变为1位数(如25->2),这样就是百位了)
int b = n / 10 % 10; // 取出十位(先去/10掉个位(250->25),再取%10新的个位,即十位)
int c = n % 10; // 取出个位
printf("%d%d%d\n", c, b, a); // 将三个位按逆序逐个输出
return 0;
}
提高
循环出队
其实,在学了循环之后,这道题还可以利用循环逐个取出各个位上的数字.
这种思路的出发点便是%10可以取个位而同时/10可以去个位,所以我们可以通过一个while循环,不断取出个位再去掉个位,将操作前的十位不断移至个位,直到无位可移(即数变为0),此时所有位已经全部倒序取出,循环结束.
参考代码(局部):
int n;
scanf("%d", &n);
do // 必须要用do-while,保证循环至少进行一次,以处理0(当然你用while然后单独加一个特判也是可以的)
{
printf("%d", n % 10); // 取出当前的个位
n /= 10; // 去掉当前已取出的个位,让前面的十位变成个位进行下一次循环中的操作
} while(n) // 即n != 0,n当前还有位未处理
printf("\n");
第4套的问题C是可以通过这种方式解决的(只需要在循环中加一个计数器即可判断位数),这题问的也相对比较多,建议收藏这篇题解,届时如果有问题可以回过来看此段内容,不单独发了.
字符串倒序输出
此外,在学了字符串之后,这道题的逐个取出各个十进制位再逆序完全可以依托字符串的特点,直接将输入作为字符串倒序输出即可解决,这里就只给出参考代码(局部)了,学过字符串的话应该可以立马理解的:
char n[5]; // 注意字符串习惯性开大一点,防止'\0'溢出
scanf("%s", n);
// 普普通通倒序输出字符串,注意别写成i++了
for(int i = strlen(s) - 1; i >=0 ; i--)
{
printf("%c", n[i]);
}
printf("\n");
第4套的问题C也可以通过这种方式解决(字符串的有效长度就是位数).
"正是我们每天反复做的事情,最终造就了我们,优秀不是一种行为,而是一种习惯" ---亚里士多德
这篇题解就到这里了,各位朋友如果有问题欢迎到acm成员群中提问哦!
「浙江理工大学ACM入队200题系列」问题 H: 零基础学C/C++18——三位数反转的更多相关文章
- 「浙江理工大学ACM入队200题系列」问题 L: 零基础学C/C++85——完美数
本题是浙江理工大学ACM入队200题第八套中的L题 我们先来看一下这题的题面. 题面 题目描述 任何一个自然数的约数中都有1和它本身,我们把小于它本身的因数叫做这个自然数的真约数. 如6的所有真约数是 ...
- 「浙江理工大学ACM入队200题系列」问题 K: 零基础学C/C++84——奇偶ASCII值判断
本题是浙江理工大学ACM入队200题第八套中的K题 我们先来看一下这题的题面. 题面 题目描述 任意输入一个字符,判断其ASCII是否是奇数,若是,输出YES,否则,输出NO; 例如,字符A的ASCI ...
- 「浙江理工大学ACM入队200题系列」问题 J: 零基础学C/C++83——宁宁的奥数路
本题是浙江理工大学ACM入队200题第八套中的J题 我们先来看一下这题的题面. 题面 题目描述 宁宁参加奥数班,他遇到的第一个问题是这样的:口口口+口口口=口口口,宁宁需要将1~9 九个数分别填进对应 ...
- 「浙江理工大学ACM入队200题系列」问题 E: 零基础学C/C++78——求奇数的乘积
本题是浙江理工大学ACM入队200题第八套中的E题 我们先来看一下这题的题面. 题面 输入 输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数,你 ...
- 「浙江理工大学ACM入队200题系列」问题 L: 零基础学C/C++52——计算数列和2/1,3/2,5/3,8/5......
本题是浙江理工大学ACM入队200题第五套中的L题 我们先来看一下这题的题面. 题面 题目描述 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13,-- 计算这个数列的前n项和.注意: ...
- 「浙江理工大学ACM入队200题系列」问题 F: 零基础学C/C++39——求方程的解
本题是浙江理工大学ACM入队200题第四套中的F题 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习惯,尤其是要利用好输入和输出样例. ...
- 「浙江理工大学ACM入队200题系列」问题 A: 零基础学C/C++34—— 3个数比较大小(冒泡排序与选择排序算法)
本题是浙江理工大学ACM入队200题第四套中的A题,同时给出了冒泡排序和选择排序算法 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习 ...
- 「浙江理工大学ACM入队200题系列」问题 B: 零基础学C/C++12——求平均值
本题是浙江理工大学ACM入队200题第二套中的B题 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习惯,尤其是要利用好输入和输出样例. ...
- [Python] 文科生零基础学编程系列二——数据类型、变量、常量的基础概念
上一篇:[Python] 文科生零基础学编程系列--对象.集合.属性.方法的基本定义 下一篇: (仍先以最简单的Excel的VBA为例,语法与Python不同,但概念和逻辑需要理解透彻) p.p1 { ...
随机推荐
- 【java】学习路径31-文件IO基本操作(未涉及到流)
一.初始化: File f1 = new File("//Users//Shared//JavaIOTest//Test01.txt"); File f2 = new File(& ...
- KingbaseESV8R6如何针对表单独设置vacuum策略
背景 书接上文 KingbaseES应对表年龄增长过快导致事务回卷 ,有些特殊业务场景不能靠全局的autovacuum方法,例如大型数据库系统,频繁做update的系统,还有上文提到的做实时数据同步的 ...
- pat乙级每日习题
欢迎加入我们:qq群:1054587486 1:https://pintia.cn/problem-sets/994805260223102976/problems/99480532591848652 ...
- Markdown学习 .md学习
# Markdown学习## 标题## 二级标题### 三级标题#### 四级标题## 字体**两个*是粗体***一个是斜体****三个是斜体加粗***~~两个~是删除线~~## 引用>走向人生 ...
- 关于mciSendString函数调用mp3音频的问题
先说结论:这个函数一定要调用MP3文件,手动改MP3格式无效,一定要保证下载源是MP3格式文件.具体可参考:https://blog.csdn.net/m0_46436640/article/deta ...
- MySQL主从同步报错故障处理记录
从库上记录删除失败,Error_code: 1032 问题描述:在master上删除一条记录,而slave上找不到,导致报错 Last_SQL_Error: Could not execute Del ...
- 在k8s集群中安装traefik,并结合kuboard界面使用
安装traefik 参考步骤:https://blog.51cto.com/u_13760351/2764008?xiangguantuijian&01 修改好的四个yaml文件下载地址:ht ...
- 部署文件:filebeat->kafka集群(zk集群)->logstash->es集群->kibana
该压缩包内包含以下文件: 1.install_java.txt 配置java环境,logstash使用 2.es.txt 三节点的es集群 3.filebeat.txt 获取日志输出到kafka集群 ...
- Nexus OSS 3 搭建并配置使用 Docker & Git LFS 仓库
转载自:https://cloud.tencent.com/developer/article/1010590 1.Nexus OSS 3 介绍 我们知道 Nexus 是一个强大的 Maven 仓库管 ...
- 一文读懂 MySQL 索引
1 索引简介 1.1 什么是 MySQL 的索引 官方定义:索引是帮助 MySQL 高效获取数据的数据结构 从上面定义中我们可以分析出索引本质是一个数据结构,他的作用是帮助我们高效获取数据,在正式介绍 ...