「浙江理工大学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 { ...
随机推荐
- .NET 纯原生实现 Cron 定时任务执行,未依赖第三方组件
常用的定时任务组件有 Quartz.Net 和 Hangfire 两种,这两种是使用人数比较多的定时任务组件,个人以前也是使用的 Hangfire ,慢慢的发现自己想要的其实只是一个能够根据 Cron ...
- 刷题记录:LC1997-访问完所有房间的第一天
LC1997-访问完所有房间的第一天 题意 这里有 n 个房间,从 0 到 n-1 编号. 你每天访问一个房间,第 0 天访问第 0 号房间. 接下来,你访问房间的[次序]将根据下面的[规则]决定: ...
- 计算机网络-DNS和HTTPDNS了解
DNS 和 HTTPDNS DNS 域名解析的过程 传统 DNS 存在的问题 1.域名缓存问题 2.域名转发问题 3.出口 NAT 问题 4.DNS 域名更新问题 5.解析延迟问题 6.运营商劫持 H ...
- 2019 CSP-S Ⅱ 游记
day0(试机) 第零天,重新打了一遍头文件和读优,熟悉了一下就匆匆走了. day1 T1一看到先把二分打了,然后发现long long要爆,好慌 主要是基础知识不够扎实,不知道unsigned lo ...
- 【java】学习路径17-StringBuffer、StringBuilder的使用与区别
本文讲解StringBuffer和StringBuilder的使用与区别. 1-- String String类型我们已经很熟悉了,String一旦被赋值,其在堆中的数据便无法修改. 平时我们的&qu ...
- HBase 安装与配置及常用Shell命令
HBase 安装与配置 首要配置 配置时间同步(所有节点上执行) yum -y install chrony vi /etc/chrony.conf #写入(7版本用server:8版本用pool): ...
- 开源:Taurus.MVC-Java 版本框架 (支持javax.servlet.*和jakarta.servlet.*双系列,内集成微服务客户端)
版本说明: 因为之前有了Taurus.MVC-DotNet 版本框架,因此框架标了-Java后缀. .Net 版本: 开源文章:开源:Taurus.MVC-DotNet 版本框架 (支持.NET C ...
- 如何在 Jenkins CI/CD 流水线中保护密钥?
CI/CD 流水线是 DevOps 团队软件交付过程的基本组成部分.该流水线利用自动化和持续监控来实现软件的无缝交付.通过持续自动化,确保 CI/CD 流水线每一步的安全性非常重要.在流水线的各个阶段 ...
- 快速排序C语言版图文详解
算法原理:选一个数位基准,将序列分成两个部分,一边全是比它小序列,另一边全是比它大序列.然后再分别对比他小的序列和比再次进行基准分割.依次分割下去,得到一个有序的队列. 原理图示: 编辑 编辑 ...
- docker学习笔记-常用镜像相关命令
docker images # 1.使用 [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED ...