郑州轻工业大学oj题解(c语言) 题解:1067: 有问题的里程表 难题探究(一)

之前发过几道简单的水题,也就是非常简单的题目,感觉反响不错,挺多人都找来做了,也算为自己的刷题量额外添加了数量~

前几天有个同学特意问我,诶,师兄,你这有水题,有没有那种水题的相反啊,就是那种特别难的题,能不能把这些题也找出来啊?emmmm,当时我二话不说截了个图给他。。。
image.png

难度都标在题目的后面了呀,明显星级越高的题目就肯定更难啊~

那么,今天就找其中一道相对有意思的难题来作为今天文章的内容吧~。


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,循环计算完毕即可得出其实际走过的公里数。

大家有没有看完后豁然开朗,感觉实际也没这么难的感觉?所谓的难题,只要敢于去逐步分析,找出题目数值之间的联系,想要完成也是非常简单的~

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容