题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2089
解析:这是一类题,注意总结。
源代码:
#include <iostream>
using namespace std;
int dp[10][3];
void init()
{
//dp[i][0]表示没有不吉利数字的,dp[i][1]表没有不吉利数字的,但开头数字为2,
//dp[i][2]表示有不吉利数字的
dp[0][1]=0;
dp[0][2]=0;
dp[0][0]=1;
for(int i=1;i<9;i++)
{
dp[i][0]=dp[i-1][0]*9-dp[i-1][1]; //位数为i的时候
dp[i][1]=dp[i-1][0];
dp[i][2]=10*dp[i-1][2]+dp[i-1][1]+dp[i-1][0];
}
}
int fun(int k)
{
int digit[15];
int q=0;
while(k)
{
digit[q++]=k%10;
k/=10;
}
digit[q+1]=0;
int ans=0;
int flag=0;
for(int i=q-1;i>=0;i--)
{
ans+=(dp[i][2]*digit[i]);//包含不吉利数字的,则直接加上就可以,不用判断。
if(flag)
{
ans+=(digit[i]*dp[i][0]);
}
else
{
if(digit[i]>4) ans+=dp[i][0];
if(digit[i]>6) ans+=dp[i][1];
if(digit[i+1]==6&&digit[i]>2) ans+=dp[i+1][1];
}
if(digit[i]==4||(digit[i+1]==6&&digit[i]==2)) flag=1;
}
return ans;//返回的是不吉利数字的个数。
}
int main()
{
init();
int n,m;
while(cin>>m>>n)
{
if(m==0&&n==0) break;
int re=n-m+1-(fun(n+1)-fun(m));//巧妙的利用(n+1)便可以不用测当前是否为不吉利数字了。
cout<<re<<endl;
}
return 0;
}