hdoj-2089-不要62

来源:互联网 发布:php 下载为电子文档 编辑:程序博客网 时间:2024/05/17 06:38

题目:不要62
代码1:(TLE)

#include<stdio.h>#include<string.h>int main(){    int n,m,i,j,t=0;    int a,b,sum=0,k=0;    while(scanf("%d%d",&n,&m)!=EOF)    {        if(n==0 && m==0)break;        for(i=n;i<=m;i++)        {            a=i;            b=i;                        sum++;                        while(a>0)            {                if(a%100==62)                {                    sum--;                    k=1;                    //printf("%d -1\n",a);                    break;                }                a=a/10;            }//是不是62                        while(b>0)            {                if(b%10==4 && k==0)                {                    //printf("%d -2\n",b);                    sum--;                    break;                }                b=b/10;            }//位数是否含四                        k=0;        }        printf("%d\n",sum);    }    return 0;}

说实在,我认为我的代码T有一点说不过去。但是它T了,discuss里也是哀声四起。hdoj里面虽说有很多好题目,但是其中个别题目质量堪忧,比如2090算菜价,明明要求四舍五入(printf("%.1lf\n",(n*m+0.05));),但是提交评测以后居然是WA,删除以后AC。
这道容易懂的题目有一种更省时间的算法,我没看到它之前没有想到这个方法。这里也贴出来:

#include<stdio.h>int data[1000005];int main(){    int m,n;    int i;    int t;    int sum;    for(i=4;i<=1000003;i++)    {        t=i;        while(t)        {            if(t%10==4||t%100==62)                data[i]=1;//符合要求数组存1            t/=10;        }    }    while(scanf("%d%d",&m,&n)!=EOF)    {        sum=0;        if(m==0&&n==0)            break;        for(i=m;i<=n;i++)            sum+=data[i];        printf("%d\n",n-m+1-sum);    }    return 0;}

先从很大范围内找出符合要求的所有数,若符合要求数组存1,之后再在输入流里面累加,n-m+1-sum

先在大范围中找出符合要求的数存入数组,在需要使用的时候调用数组内元素。省时的一种小技巧。

0 0