HDU 2089 不要62【打表】

来源:互联网 发布:linux常见的服务器配置 编辑:程序博客网 时间:2024/05/16 17:33

不要62

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 28809 Accepted Submission(s): 10125


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 1000 0

Sample Output
80



这个题数据比较多,优选打表,就是提前把所有的数据都考虑到,逐个判断,特殊标记上(0或1之类的),然后操作的时候就省去了多次重复操作。

这个方法用的不少,筛选素数也是这个方法。


#include<stdio.h>int s[1000005];int main(){int n,m,i,j,x;for(i=1;i<1000005;++i){x=i;while(x)//判断某数是否符合要求{if(x%10==4||x%100==62){s[i]=1;}x/=10;}}int c;while(scanf("%d%d",&n,&m),m||n){c=0;for(i=n;i<=m;++i){if(s[i]==1)//统计特殊数据{++c;}}printf("%d\n",m-n+1-c);//注意输出}return 0;}



发现之前的打表好丑啊,再次做到这个题,稍微优化一下..........


/*2016年1月15日 16:36 */#include<stdio.h>#include<string.h>int luck(int x){    while(x)    {        if(x%10==4||x%100==62)        {            return 0;        }        x/=10;    }    return 1;}int x[1000005];int main(){    int i,n,m,s;    for(i=1;i<1000005;i++)    {        x[i]=x[i-1]+luck(i);    }    while(scanf("%d%d",&n,&m)&&(n||m))    {        printf("%d\n",x[m]-x[n-1]);    }    return 0;}



0 0