洛谷 P1865 A%B Problem

题目描述

给定 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值