题目传送门

此题题意十分明确:就是让我们统计在[L , R]区间内的数字2出现的次数。

然后我们再看一看此题的数据范围:1≤L≤R≤100000,所以用n log n的复杂度是可以过的。


1.解题思路

我们只需枚举[L,R]区间内每个数字里共出现了多少个2.

2.解题步骤

first,枚举每个数字就不必多说了:

for(int i = l ; i <= r ; i++)//i即为我们枚举的数字
{
                     
}

second,对于每个数字i,统计2出现的次数时,我们需要一位一位去判断,具体方法见例子:

如数字123456,我们想一位一位取出来,不难想到,我们将123456%10后的结果就是数的最后一位->6.

那么,我们又该如何判断下一位呢?只需将数字÷10就可以将最后一位->6给舍去了,按这样重复计算,知道数字为0为止,代码如下:

while(num != 0)
{
	printf("%d\n" , num % 10);
	num /= 10;
}

运行结果如下图:

显而易见,这样就实现了数位拆分。


完整代码如下:

#include<stdio.h>
using namespace std;
int l , r , ans;
int main()
{
	scanf("%d%d" , &l , &r);//读入两个整数l,r 
	for(int i = l ; i <= r ; i++)//枚举区间内每个数 
	{
		int sum = i;//注意此处的用法,一定要另外用一个变量存这个数,否则会超时 
		while(sum != 0)//数位拆分 
		{
			if(sum % 10 == 2)//判断这位数是否为2 
			{
				ans++;
			}
			sum /= 10;//将最后一位舍去 
		}
	}
	printf("%d" , ans);
	return 0;
}