题意:
求n 到 m 的区间范围内不含有4 和 62 的数字个数。 解题思路 与 HDU 3555类似
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #include <algorithm> using namespace std; const int MAXN = 10; int dp[MAXN][3]; // dp[i][0] 长度为i,不含有不吉利数字 // dp[i][1] 长度为i,不含有不吉利数字且首位为2 // dp[i][2] 长度为i, 含有不吉利数字 void init() { dp[0][0] = 1; dp[0][1] = dp[0][2] = 0; for(int i=1;i<=10;i++) { dp[i][0] = dp[i-1][0] * 9 - dp[i-1][1]; dp[i][1] = dp[i-1][0]; dp[i][2] = dp[i-1][2] * 10 + dp[i-1][0] + dp[i-1][1]; } } int bit[MAXN]; int solve(int n) { int len = 0; memset(bit, 0, sizeof(bit)); int tmp = n; while(n) { bit[++len] = n % 10; n /= 10; } int ans = 0; int flag = 0; for(int i=len;i>=1;i--) { ans += bit[i] * dp[i-1][2]; if(flag) ans += bit[i] * dp[i-1][0]; else { if(bit[i] > 4) ans += dp[i-1][0]; if(bit[i] > 6) ans += dp[i-1][1]; if(bit[i+1] == 6 && bit[i] > 2) ans += dp[i][1];//这一行不要忘记 } if(bit[i+1] == 6 && bit[i] == 2) flag = 1; if(bit[i] == 4) flag = 1; } if(flag) ans++; return tmp - ans; } int main() { int n, m; init(); while(scanf("%d%d", &n, &m)!=EOF) { if(n == 0 && m == 0) break; int ans = solve(m) - solve(n - 1); printf("%d\n", ans); } return 0; }
原文地址:http://blog.csdn.net/moguxiaozhe/article/details/45315573