Problem Description:
杭州人称那些傻乎乎粘嗒嗒的人为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
代码:
solve(int x) 返回[0,x)中符合题意的有多少个,它的区间左闭右开;
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAX=8;
int dp[MAX][10];
int d[MAX];//每个位上的数储存进入d[i]数组中
void init()//初始化dp去统计符合要求的个数
{dp[0][0]=1; for(int i=1;i<7;i++)//因为题目规定最多七位数 for(int j=0;j<=9;j++)//这个位上可以选择0-9的数 for(int k=0;k<=9;k++)//用来控制这位的下一位的数(0-9)if(j!=4&&!(j==6&&k==2)) //将4或者62的排除 dp[i][j]+=dp[i-1][k];//i表示数的位数,j表示第一位数
}
int solve(int n)//调用函数
{int ans=0;int len=0;while(n)//将n的每个位上的数储存进入d[i]数组中 {++len;//用来统计这个数的位数长度 d[len]=n%10; n/=10;} d[len+1]=0;//for(int i=len;i>=1;i--)//从最高位开始 {for(int j=0;j<d[i];j++)//d[i]表示第i位的这个数的值从(0-d[i]) if(d[i+1]!=6||j!=2) ans+=dp[i][j];//i表示数有几位,j表示 以j开头的i位数//如:dp[3][2]表示2_ _; if(d[i]==4||(d[i+1]==6&&d[i]==2)) break;//表示如果这个数的这个位置是4或者(这个位置是2并且上个位置是6)就跳出 }return ans;//返回符合要求的数的个数
}
int main()
{int m,n;init();//调用初始化 while(scanf("%d%d",&m,&n)==2){ if(n==0&&m==0) break;//如果输入0 0就退出. printf("%d\n",solve(n+1)-solve(m));//通过调用函数来算出m到n之间符合要求的个数//因为solve(int x)返回[0,x)中符合题意的有多少个}return 0;
}