C - 不要62
C - 不要62
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
Input
输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。
Output
对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。
Sample Input
1 100
0 0
Sample Output
80
运行代码
#include <iostream> #include <algorithm> #include <string> using namespace std; int dp[10][10]; int a[10]; int f(int m) { int x=0, y=0; while(m) { y++; a[y] = m % 10; m = m / 10; } a[y+1] = 0; for(int i=y; i>=1; i--) { for(int j=0; j<a[i]; j++) if(a[i+1]!=6 || j!=2) x = dp[i][j] + x; if(a[i]==4 || (a[i+1]==6 && a[i]==2)) break; } return x; } int main() { int n, m; dp[0][0] = 1; for(int i = 1; i <= 7; ++i) for(int j = 0; j <= 9; ++j) for(int k = 0; k <= 9; ++k) if(!(j==6 && k==2) && j!=4) dp[i][j] += dp[i-1][k]; while(scanf("%d %d", &n, &m)) { if(n==0 && m==0) break; printf("%d\n", f(m+1) - f(n)); } return 0; }
代码理解
经过思考这个问题首要想到的是对输入的字符串进行分割然后存入数组,既123456分割成“1”“2”等等,进行储存,最好使用动态数组或空间小的动态数组,避免开的数组太多占用太多内存。存入数据后则进行判断,一次判断两位,若出现4或者62则跳过进行下一次运行,若两位判断不出4或者62则删除一位再次进行两位判断。直到最后所有判断完毕得出判断不含有4或者62的次数。