Hello大家好啊我是小亦,今天是我更新的第四篇,我有可能要暂时不更新了QWQ看情况吧,但是还是来讲一下这道题,这道题同样来自NOIP2013年普及组的真题同样非常的简单啊话不多说看思路:
这道题呢是让我们求得也是,模拟和字符串其实和上一道题有点相似吧qwq,已下呢是我的个人思路步骤:
这道题要求我们计算从1到n的所有整数中,数字x出现的次数。这里的关键是理解数字x可以出现在任何一个数位上,包括个位、十位、百位等等。我们可以通过以下步骤来解决这个问题:
-
逐个检查每个数字:遍历从1到n的每一个整数。
-
分解每一位:对于当前遍历到的数字,我们需要检查它的每一位是否等于x。
-
计数:如果某一位等于x,我们就增加计数器。
-
考虑所有数位:对于每个数字,我们都需要检查它的个位、十位、百位等所有数位。
-
优化:对于大的n值,上述方法可能会非常慢,因为我们需要检查每个数字的每一位。我们可以通过数学方法来优化这个过程,例如,计算每个数位上数字x出现的频率。
-
数学方法:我们可以计算在给定的范围内,某个特定的数位上数字x出现的次数。例如,对于个位,每10个数字x就会出现一次。对于十位,每100个数字x就会出现10次,以此类推。
-
计算频率:对于每个数位,我们可以计算在1到n的范围内,数字x出现的次数。
-
累加结果:将所有数位上x出现的次数累加起来,得到最终的结果。
-
处理边界情况:对于数字的边界情况,如n是一位数或x是0,我们需要特别处理。
下面是一个使用数学方法的优化思路:
-
初始化计数器:设置一个计数器来记录x出现的次数。
-
计算个位上的出现次数:计算从1到n的数字中,x出现在个位上的次数。
-
计算十位上的出现次数:计算从1到n的数字中,x出现在十位上的次数。
-
计算更高位上的出现次数:对于百位、千位等,我们可以使用类似的计算方法。
-
累加:将所有数位上的出现次数累加起来。
-
处理最后一位数字:如果n本身小于10,我们只需要检查个位。如果n小于100,我们还需要检查十位,以此类推。
-
输出结果:最后输出计数器的值,这就是x在1到n的范围内出现的次数。
说白了使用数学方法就可以显著提高计算效率,特别是对于大的n值。这种方法的时间复杂度是O(1),因为它不依赖于n的值,好了说完了赶紧给代码吧qwq。
#include <bits/stdc++.h>
using namespace std;
int main(){
int a,b,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;
}
小亦提醒,抄题解可耻,但是注释没写对不起哈,轻点喷行吗qwq