之前发过几道简单的水题,也就是非常简单的题目,感觉反响不错,挺多人都找来做了,也算为自己的刷题量额外添加了数量~
难度都标在题目的后面了呀,明显星级越高的题目就肯定更难啊~
那么,今天就找其中一道相对有意思的难题来作为今天文章的内容吧~。
1067: 有问题的里程表
- 题目描述
某辆汽车有一个里程表,该里程表可以显示一个整数,为该车走过的公里数。然而这个里程表有个毛病:它总是从3变到5,而跳过数字4,里程表所有位(个位、 十位、百位等)上的数字都是如此。例如,如果里程表显示339,汽车走过1公里之后,该里程表显示350。 - 输入
输入一个整数num,表示里程表显示的数值,1 < num < 1000,且一定不含整数4。 - 输出
输出一个整数,为该汽车实际行驶的公里数。例如,如果该里程表显示55,则实际走过的公里 数是40。 - 参考代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int num,c=0;
scanf("%d",&num);
for(int i=1;i<=num;i++){
if(i%10!=4&&i/10%10!=4&&i/100%10!=4){
c++;
}
}
printf("%d\n",c);
return 0;
}
- 代码解析:
- 在开始解析之前,说明一下,所谓的难题,绝不意味着一道题的代码量有多大,算法有多复杂,而是全靠对题目的理解而已。我们首先看题目,一个里程表,表上有三位数字,但任何一位都不能显示4,则说明,表上的数字会跳过4而直接显示下一位,故最后显示的公里数会比与其预期走过的要多出跳过的那些距离。
- 当然,题目这里要求我们算的是实际走过的路程,而非我们跳过的那些距离,所以在这里我们把总距离减去我们跳过的距离就能得出最终的答案~
- 在这里,我们就有了两个选择,一,是求出我们跳过了的里程数,也就是单一位含有4情况的里程,这里的单一位包括百十个,需要我们分别计算,最终用总里程减去跳过的里程即可。二,是求出我们实际走了的里程,这个也不难理解,只要没有任何一位有4,我们就把这位算作实际走过的里程即可,比第一种要省下一步。
- 这里,我们就以第二种为主进行分析。我们要求的是没有任何一位包括4的数,我们就把这个坏的里程输入循环来进行逐一判断排除。这里就要用到我们最初学过的知识,1004的数位分离,分别判断:个,十,百,各个位置都不=4的情况,我们把这些判断的例子用&&连在一起,只要三位数都不出现4,我们就把实际里程+1,循环计算完毕即可得出其实际走过的公里数。
大家有没有看完后豁然开朗,感觉实际也没这么难的感觉?所谓的难题,只要敢于去逐步分析,找出题目数值之间的联系,想要完成也是非常简单的~