Hello 大家好我是小亦,今天又来更新第三篇题解?应该是吧,更了那么多我都不知道更了多少哈哈,好了,不笑了,今天我们来讲一下来自NOIP2013年普及组真题,有时候我真的搞不懂,为什么NOIP的知识还在入门水平啊(指的是洛谷的最低水平,无了个大语qwq),话不多说,继续来讲一下这道题的思路,如果觉得这道题对你有帮助的话那就点个赞赞吧或关注qwq,来吧思路:
首先呢这道题是要用到模拟,字符串难怪会那么简单,我说官方也是的出那么简单,话不多说,下面是我的个人思路步骤
-
理解问题:我们需要计算从1到n的每个数字中,数字x出现的次数。这里的x是一个0到9之间的数字。
-
逐个检查:对于从1到n的每个数字,我们需要检查它每一位上的数字是否等于x。
-
分解数字:我们可以将每个数字分解成各个位数上的数字,然后检查每一位是否等于x。
-
计数:如果某一位等于x,我们就增加计数器。
-
优化:对于大的n值,逐个检查每个数字的每一位可能效率不高。我们可以通过数学方法来优化这个过程。
-
数学方法:我们可以计算每个数位上数字x出现的频率。例如,对于个位,每10个数字x就会出现一次。对于十位,每100个数字x就会出现10次,以此类推。
-
实现算法:根据上述思路,我们可以编写一个算法来计算数字x在1到n的范围内出现的次数。
下面呢我使用了数学方法优化后的算法思路qwq:
-
初始化计数器:设置一个计数器来记录x出现的次数。
-
循环遍历:从1遍历到n。
-
当前数字:在每次循环中,取出当前的数字。
-
检查每一位:对于当前数字的每一位,检查它是否等于x:
- 如果是,计算这个数位上x出现的次数。例如,如果x是当前的个位数字,那么在下一个10的倍数之前,x会在每个数字的个位上出现一次。
-
累加计数:将每个数位上x出现的次数累加到计数器上。
-
处理边界:对于最后一个数字,如果它小于10,我们只需要检查个位。如果它小于100,我们还需要检查十位,以此类推。
-
输出结果:最后输出计数器的值,这就是x在1到n的范围内出现的次数。
这种方法可以显著减少计算量,特别是对于大的n值。在实现时,我们可以使用字符串来处理数字的每一位,或者使用数学计算来直接得出每个数位上x出现的次数。
好了说了那么多,代码给上,小亦再次提醒抄代码可耻哟(^U^)ノ~YO
#include <bits/stdc++.h>
using namespace std;
int main(){
int a = 0,b = 0,j=0;
scanf("%d %d",&a,&b);
for(int i=1;i<=a;i++){
int d=i;
while(d>0){
int c=d%10;
d=d/10;
if(c==b){
j++;
}
}
}
printf("%d",j);
return 0;
}
由于这道题过于简单,所以就不给注释辣(纯想偷懒嘿嘿)下期见