详解(转载)
#include<stdio.h>
#include<string.h>
int dp[10][10];
int solve(int x)
{
int num[10];
int tmp=x;
int len=0;
while(x)
{
num[++len] = x%10;
x/=10;
}
num[len+1]=0;
int sum=0;
int flag=0;
for(int i=len;i>=1;i--)
{
sum += dp[i-1][2] * num[i];
if(flag)
sum += dp[i-1][0] * num[i];
if(!flag && num[i] > 4)
sum += dp[i-1][0];
if(!flag && num[i+1]==6 && num[i]>2)
sum += dp[i][1];
if(!flag && num[i] > 6 )
sum += dp[i-1][1];
if(num[i] == 4 || (num[i+1]==6 && num[i]==2))
flag = 1;
}
return tmp-sum;
}
int main()
{
int n,m;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=6;i++)
{
dp[i][0] = dp[i-1][0] * 9 - dp[i-1][1];
dp[i][1] = dp[i-1][0];
dp[i][2] = dp[i-1][2] * 10 + dp[i-1][0] + dp[i-1][1];
}
while(~scanf("%d%d",&n,&m))
{
if(n==0 && m==0)
break;
printf("%d\n",solve(m+1)-solve(n));
}
return 0;
}