这道题看了好多其他人的的博客,用的方法都是数位DP,感兴趣的伙伴可以找找学习学习。自己第一次做的时候DP这方面用的不是很熟练就没想到数位DP,后来把最初的思路改进了一下也能AC了,不过过两天还是要好好学习一下DP。
思路:首先对整数的范围进行预处理,处理方法为:把每个数的每位分离出来放入数组中,然后判断这个数是否含有4或62,如果含有就把标志数组中这个数的标志记为1,处理完后含有4或62的标志位为1,不含的标志位为0。最后在主函数的输入范围中,依次把标志数组中的数加在一起就可以得到该范围中含有4或62的数量,再用区间长度减去zhe'g这个数就可以得到最后的结果了。
附已AC代码:
#include<iostream>
#include<cstring>
using namespace std;
int num[1000010] = {0};
int a[10];
void fun()
{
memset(num,0,sizeof(num));
int i,flag,temp,j;
for(i = 4; i < 1000010; ++i)
{
flag = 0;
temp = i;
while(temp > 9)
{
a[flag++] = temp % 10;
temp = temp / 10;
}
a[flag] = temp;
for(j = flag; j >= 0; --j)
{
if(a[j] == 4)
{
num[i] = 1;;
break;
}
if(a[j] == 6 && a[j - 1] == 2)
{
num[i] = 1;
break;
}
}
}
}
int main()
{
int x,y,i;
int sum,all;
int a[10];
fun();
while(cin >> x >> y && x && y)
{
all = y - x + 1;
sum = 0;
for(i = x; i <= y; ++i)
{
if(num[i])
sum += num[i];
}
cout << all - sum << endl;
}
return 0;
}