原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=2089
转载自别人的代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
using namespace std;
int dp[10][20];
void Build()
{
memset( dp, 0, sizeof(dp) );
dp[0][0] = 1;
for( int i = 1; i <= 7; i++ )
{
for( int j = 0; j < 10; j++ )
{
for( int k = 0; k < 10; k++ )
if( j != 4 && !(j == 6 && k == 2) )
dp[i][j] += dp[i-1][k];
}
}
}
int judge( int num )
{
int digit[10];
int length = 1;
while( num )
{
digit[length++] = num % 10;
num /= 10;
}
digit[length] = 0;
int ans = 0;
for( int i = length-1; i > 0; i-- )
{
for( int j = 0; j < digit[i]; j++ )
{
if( j != 4 && !(digit[i+1] == 6 && j == 2 ) )
ans += dp[i][j];
}
if( digit[i] == 4 || (digit[i] == 2 && digit[i+1] == 6) )
break;
}
return ans;
}
int main()
{
int n, m;
Build();
while( scanf("%d %d", &n, &m) != EOF && (n+m) )
{
printf( "%d\n", judge(m+1) - judge(n) );
}
return 0;
}