【运行别超时】最近小何去在我们学校的比赛中遇到一个有意思的题,答案做出来了,但运行总是超时。这怎么解决呢?来看看吧。

 题目内容如下

        小C最近在研究数论,他发现质数有太多美妙的性质了,于是他想要统计一下一段区域里的数有多少是质数,请你编程帮他解决这个问题吧。

输入格式:

第一行一个正整数 t,表示数据组数。(1≤t≤105)

接下来 t 行,每行两个正整数l,r,表示区间的左右端点。(1≤l≤r≤106)

输出格式:

每组数据输出一个整数,表示闭区间[l,r]中的质数数量

输入样例:

2
1 3
2 6

输出样例:

在这里给出相应的输出。例如:

2
3

代码长度限制:16 KB

时间限制:400 ms

内存限制:256 MB

下面一起来看代码:

#include
#include
int a[1000001]={0}; //定义全局变量
void zhishu(int num){
    
    int i,j,flag;
    for(i=2;i<=num;i++){
        flag=0;
        for(j=2;j<=sqrt(i);j++){
            if(i%j==0){
                flag=1;
                break;//这个很重要,减少循环次数
            }
        }
        if(flag==0)     //判断是否位质数,对数组a进行操作
            a[i]=a[i-1]+1;
        else
            a[i]=a[i-1];
    }
}
int main()
{
    int l,r,n;
    scanf("%d",&n);
    zhishu(1000000);        //在循环外调用一次,每个下标代表l或者r。对应的值代表前面有多少个质数
    while(n--){
        scanf("%d%d",&l,&r);
        printf("%d\n",a[r]-a[l-1]); //l-1 是因为求的素数范围是闭区间
    }
}

        做着道题的时候,开始想着将for循环改成while循环节约时间,但最后还是会有两个测试点超时。由于当时没时间就没管了,下来仔细一想,原来可以通过定义全局变量来减少循环判定的次数,也就是说将判定质数的方法模块化了,通过定义全局变量来减少代码的冗余。

        但在实际应运中,还是不支持定义外部局部变量,我们可以对代码进行优化,减少全局变量的使用:

1.使用static声明局部静态变量,通过函数返回方式接收函数内部的数组的地址:

#include
#include

int* zhishu(int num){
    static int a[1000001]={0}; //定义静态局部变量
    int i,j,flag;
    for(i=2;i<=num;i++){
        flag=0;
        for(j=2;j<=sqrt(i);j++){
            if(i%j==0){
                flag=1;
                break;
            }
        }
        if(flag==0)
            a[i]=a[i-1]+1;
        else
            a[i]=a[i-1];
    }
    return a;
}
int main()
{
    int l,r,n;
    scanf("%d",&n);
    int* p=zhishu(1000000);
    while(n--){
        scanf("%d%d",&l,&r);
        printf("%d\n",p[r]-p[l-1]);
    }
}

2.通过数组传参: 

#include
#include
int* zhishu(int num,int* a){
    int i,j,flag;
    for(i=2;i<=num;i++){
        flag=0;
        for(j=2;j<=sqrt(i);j++){
            if(i%j==0){
                flag=1;
                break;
            }
        }
        if(flag==0)
            a[i]=a[i-1]+1;
        else
            a[i]=a[i-1];
    }
    return a;
}
int main()
{
    int l,r,n;
    int a[1000001]={0}; //定义局部变量
    scanf("%d",&n);
    zhishu(1000000,a);        //通过数组的形式来定义数组a的值
    while(n--){
        scanf("%d%d",&l,&r);
        printf("%d\n",a[r]-a[l-1]);
    }
}

         通过数组传参的方法就大大解决了这一问题。小何的烦恼也无有了。

你可能感兴趣的:(c语言)