题目内容如下:
小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]);
}
}
通过数组传参的方法就大大解决了这一问题。小何的烦恼也无有了。