数位dp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 10;
int dp[maxn][maxn];
void init()
{
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for (int i = 1; i < 7; i++)
for (int j = 0; j < maxn; j++)
for (int k = 0; k < maxn; k++)
if (j != 4 && !(j == 6 && k == 2))
dp[i][j] += dp[i-1][k];
}
int cal(int k)
{
int sum = 0;
int cnt[10] = {0};
int len = 0;
while (k)
{
cnt[++len] = k % 10;
k /= 10;
}
for (int i = len; i; i--)
{
for (int j = 0; j < cnt[i]; j++)
{
//计算时,如63,因为十位加不到6,用不到dp[2][6],而是用的dp[1][2],后者实际代表62的情况,但没有抛去62
if (!(j == 2 && cnt[i+1] == 6))
sum += dp[i][j];
}
//防止之后的位加上不该加的东西
if(cnt[i]==4||(cnt[i+1]==6&&cnt[i]==2))
break;
}
return sum;
}
int main()
{
int a, b;
init();
while (cin >> a >> b)
{
if(a==0&&b==0)
break;
cout << cal(b+1) - cal(a) << endl;//前的Cal(k)是计算出从1到k-1的符合条件的数的个数
}
system("pause");
return 0;
}