Primes

该博客介绍了一个计算在两个整数之间(包括这两个数)素数个数的程序。程序通过Sieve of Eratosthenes算法预先生成素数表,并在输入给出的整数范围时,快速计算出素数的数量。输入可以处理多组数据,直到遇到结束标志A=B=-1。输出是每组数据对应的素数个数。
摘要由CSDN通过智能技术生成

A pretty straight forward task, calculate the number of primes between 2 integers.

Given 2 integers A \leq B < 5*10^6A≤B<5∗106 what's the number of primes in range from A to B inclusive.

Note: A prime number is a positive integer greater than 1 and is divisible by 1 and itself only. For N to be prime it is enough to test the divisibility of numbers less than or equal to square root of N.

Input

As many as 1000 lines, each line contains 2 integers A and B separated by a space. Input is terminated when A = B = -1 (Do not process this line).

Output

For every line in input – except for the last line where A = B = -1 - print the number of prime numbers between A and B inclusive.

Example

Input

0 9999
1 5
-1 -1

Output

1229
3

计算素数个数 位集 打表

#include <bits/stdc++.h>
using namespace std;
bitset<10000000> p;
int q[5000010];
void sieve()
{
	p.set(); // 全部设置为1
	for(int i = 4;i < 1e7; i += 2)
		p.reset(i);    // 2的倍数为置为零
	for(int i = 3;i < 10000; i += 2)
		if(p.test(i)) //清除素数的倍数 
			for(int j = i*i; j < p.size(); j += i*2)
				p.reset(j); 
	p[0] = p[1] = 0;
	int cnt = 0;
	for(int i = 2;i < 5000010; i++){
		if(p.test(i)) q[i] = ++cnt;
		else q[i] = cnt;
	}
}
int main()
{
	int a,b;
	sieve();
	while(cin >> a >> b && a >= 0 && b >= 0){
		if(a == 0) a = 1;
		cout << q[b]-q[a-1] << "\n";
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值