for i = len ~ 1 //枚举哪一位<n的对应位
for j = 0 ~ digit[i] - 1 //枚举这一位的取值
if j <> 4 and not (j = 2 and digit[i + 1] = 6)
ans = ans + f[i,j]; //情况合法
if digit[i] = 4 or (digit[i] = 2 and digit[i + 1] = 6) break; //已经出现4或62
1 100 0 0
80
dp[i][j] 表示 长度为i,最高位为j的,满足要求的个数...
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[7][10],num[11]; void init() { int i,j,k; dp[0][0]=1; for(i=1;i<=7;i++) { for(j=0;j<10;j++) { for(k=0;k<10;k++) if(j!=4&&!(j==6&&k==2)) dp[i][j]+=dp[i-1][k]; } } } int work(int n) { int len=0,i,j,k,ans; while(n) { num[++len]=n%10; n/=10; } ans=0; num[len+1]=0; for(i=len;i;i--) { for(j=0;j<num[i];j++) if(j!=4&&!(j==2&&num[i+1]==6)) ans+=dp[i][j]; if(j==4||(j==2&&num[i+1]==6)) break; // 完成dp[len][num[len]]的统计 } return ans; } int main() { int n,m; init(); while(cin>>n>>m) { if(n+m==0) break; cout<<work(m+1)-work(n)<<endl; } return 0; }