标题:我这个程序超时了,原因何在?怎么改呢
只看楼主
上海之恋
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2010-2-18
结帖率:0
已结贴  问题点数:1 回复次数:21 
我这个程序超时了,原因何在?怎么改呢
题目为

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
我的代码是

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void main()
{ int n,m,i,c=0;
char b[1000000];
while(scanf("%d %d",&n,&m)!=EOF&&0<n&&m>=n&&m<1000000)
{
for(i=n;i<=m;i++)
{ itoa(i,b,10);
if(strchr(b,'4')!=NULL||strstr(b,"62")!=NULL)
c++;

}
printf("%d\n",m-n+1-c);
c=0;
}
}

在OJ下提交说 超时了,原因?
搜索更多相关主题的帖子: 超时 
2010-02-18 15:50
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
得分:0 
oj 网址能不能标出来?
2010-02-18 16:25
gtl75008810
Rank: 2
等 级:论坛游民
帖 子:29
专家分:71
注 册:2010-2-2
得分:0 
做个记号~
2010-02-18 20:31
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
看这个算法就感觉不是很好,会超时也很可能。你应该想办法优化一下。
2010-02-18 21:20
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
得分:0 
你试试我的程序能否过去?另外能贴上oj 网址吗?
#include<stdio.h>
long result[1000000]={0,1,2,3,3};
long func(int n)
{
    long t,r,flag;
    if(n<=4 || result[n]!=0)
    {
        return result[n];
    }
    else
    {
        flag=1;t=n;
        while(t)
        {
            r=t%100;
            if(r==62||r%10==4||r/10==4){flag=0;break;}
            t=t/10;
        }
        result[n]=func(n-1)+flag;
        return result[n];
    }
}

void main()
{
    long n,m,t;


    while(scanf("%d%d",&n,&m)!=EOF&&0<n&&m>=n&&m<1000000)
    {
        t=func(m)-func(n-1);
        printf("%d\n",t);
    }
}

2010-02-19 00:37
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
得分:0 
用字符串来处理应该是更聪明的做法!

★★★★★为人民服务★★★★★
2010-02-19 09:30
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
但这道题明显不能挨着帮试。要是几千个数,每个都比较大,还得遂数位检查,怎么想也得超时。
2010-02-19 16:15
jig
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
得分:0 
你在什么环境下编译的?TC?你的 m<1000000 要在TC下,是16位,已经出错

即使使用长整型建议 m<1000000L

个人网站 -  http://.h001.
2010-02-19 16:43
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
得分:0 
按照您的思路,改写了一下,您去提交一下,看看结果如何?和你的输出结果有出入:

程序代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 10

int main(void)
{
    char a[N];
    int a_int,b_int;
    int a_len,i,t,m;

    while(1)
    {
        if((scanf("%d %d",&a_int,&b_int))!=2)
        {
            break;
        }
        if(!a_int||a_int>=b_int)
        {
            break;
        }
        itoa(a_int,a,10);
        t=0;
        a_len=strlen(a);
        m=b_int-a_int+1;
        while(m)
        {
            if(strchr(a,'4')==NULL&&strstr(a,"62")==NULL)
            {
                ++t;
            }
            a[a_len-1]+=1;
            if(a[a_len-1]>'9')
            {
                for(i=a_len-1;i>0;--i)
                {
                    if(a[i]>'9')
                    {
                        a[i-1]+=1;
                        a[i]='0';
                    }
                }
            }
            if(a[0]>'9')
            {
                for(a_len+=1,i=a_len-1;i>0;--i)
                {
                    a[i]=a[i-1];
                }
                a[0]='1';
                a[1]='0';
            }
            a[a_len]=0;
            --m;
        }
        printf("%d\n",t);
    }

    return 0;
}
2010-02-19 23:09
上海之恋
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2010-2-18
得分:0 
回复 楼主 上海之恋
http://acm.hdu.
2010-02-20 10:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-297764-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.150660 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved