题目描述
给定 l, r,求区间 [l, r] 内质数的个数。
输入格式
第一行有两个整数,分别代表询问次数 n 和 给定区间的右端点最大值 m。
接下来 n 行,每行两个整数 l,r,代表一次查询。
输出格式
对于每次查询输出一行,若 l,r∈[1,m],则输出区间质数个数,否则输出 Crossing the line
。
思路
水题,数据也很水,用筛法便可AC
(看错数据范围导致debug了一个小时。。。无语
今天在debug时还学会了一个新知识:不同异常对应的代码错误
3221225477 (0xC0000005): 访问越界,一般是读或写了野指针指向的内存
3221225725 (0xC00000FD): 堆栈溢出,一般是无穷递归造成的
3221225620 (0xC0000094): 除0错误,一般发生在整型数据除了0的时候
我在第一次打质数表时把max搞到了10的11次方,美美地堆栈溢出:)
代码
#include<stdio.h>
#include<string.h>
typedef long long ll;
#define max 1000001
int main(){
ll a[max]={0};
for(int i=2;i<max;i++){
a[i]=1;
}
for(int i=2;i<max;i++){
if(a[i]){
for(int j=2;i*j<max;j++){
a[i*j]=0;
}
}
}
ll n,m,l,r;
int sum=0;
scanf("%lld %lld",&n,&m);
while(n){
scanf("%lld %lld",&l,&r);
if(l>=1&&r<=m){
while(l<r+1){
if(a[l]) sum++;
l++;
}
printf("%d\n",sum);
}else{
printf("Crossing the line\n");
}
n--;
sum=0;
}
return 0;
}