杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
Input
输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。
Output
对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。
Sample Input
1 100
0 0
Sample Output
80
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[1000][2],num[11001];
int dfs(int len,int if6,int lim)
{
/*len表示当前搜到了第几位*/
/*if6表示上一位是不是6*/
/*lim表示遍历过的前n位有没有限制比如最大边界是52631 如果遍历过的前三位是526那摩后面一位的数就有限制了*/
int i,max1,sum=0;
if(len==0) return 1;
if(lim==0&&dp[len][if6]!=-1) return dp[len][if6];
if(lim==1) max1=num[len];/*前几位相同那*/
else max1=9;
for(i=0; i<=max1; i++)
{
if(i==4||(if6&&i==2))/*上一位是6这一位*/ continue;
sum+=dfs(len-1,i==6,lim&&i==max1/*前一位跟本位都有限制可推下一位有限制*/);
}
if(lim==0) dp[len][if6]=sum;
return sum;
}
int sum(int n)
{
int k;
k=0;
while(n) num[++k]=n%10,n/=10;
return dfs(k,0/*最高位之前无6*/,1);
}
int main()
{
int n,m;
while(scanf("%d%d",&m,&n)&&(m!=0||n!=0))
{
memset(dp,-1,sizeof(dp));
printf("%d\n",sum(n)-sum(m-1));
}
return 0;
}