dp[dep][six]表示长度为dep的,上一位是否为6的不含62,不含4的数的个数
1 #include<bits/stdc++.h> 2 using namespace std; 3 int dp[10][2],dig[10]; 4 int dfs(int dep,int six,int flag){ 5 if(!dep)return 1; 6 if(!flag&&dp[dep][six]!=-1)return dp[dep][six]; 7 int lim=flag?dig[dep]:9; 8 int ans=0; 9 for(int i=0;i<=lim;i++){ 10 if((six&&i==2)||i==4)continue; 11 ans+=dfs(dep-1,i==6?1:0,flag&(i==lim)); 12 } 13 if(!flag)dp[dep][six]=ans; 14 return ans; 15 } 16 int solve(int x){ 17 int dd=0; 18 while(x)dig[++dd]=x%10,x/=10; 19 return dfs(dd,0,1); 20 } 21 int main(){ 22 memset(dp,-1,sizeof(dp)); 23 int A,B; 24 while(1){ 25 scanf("%d%d",&A,&B); 26 if(!A&&!B)break; 27 printf("%d ",solve(B)-solve(A-1)); 28 } 29 return 0; 30 }