标签:前缀 号码 ems 顺序 http return 数字 panel +=
<题目链接>
# include<cstdio> # include<iostream> # include<cstring> using namespace std; int dp[10][10];//dp[i][j]表示的是以j开头的i位数中,不含4和62的个数 int digit[10]; void init() //先打一张表,预先算出题目可能需要的所有dp[i][j]; { memset(dp, 0, sizeof(dp)); dp[0][0] = 1; for (int i = 1; i <= 7; i++) { for (int j = 0; j <= 9; j++) {//枚举第i位 for (int k = 0; k <= 9; k++) {//枚举第i-1位 if (j != 4 && (!(j == 6 && k == 2))) { dp[i][j] = dp[i][j] + dp[i - 1][k]; } } } } } int sum(int n) //求的是小于n的数字有多少个,从下面的j<digit[i]可以看出 { int len = 0; int ans = 0; while (n != 0) { digit[++len] = n % 10; n = n / 10; } digit[len + 1] = 0; for (int i = len; i >= 1; i--) //i表示枚举的数字的位数,j表示,所有小于n的各位数为起点的数的数量 { for (int j = 0; j < digit[i]; j++) { if (j != 4 && (!(digit[i + 1] == 6 && j == 2))) //注意这里是i+1,因为digit内是按位数从小到大的顺序存的 { ans += dp[i][j]; } } if (digit[i] == 4 || (digit[i] == 2 && digit[i + 1] == 6)) { break; } } return ans; } int main(void) { int n, m; while (cin >> n >> m, n || m) { init(); printf("%d\n", sum(m+1) - sum(n)); } return 0; }
标签:前缀 号码 ems 顺序 http return 数字 panel +=
原文地址:https://www.cnblogs.com/00isok/p/9384342.html