描述:
用筛法求[a,b]中的素数。
Find out the prime numbers in [a, b].
输入:
2个正整数:a b。
a、b均在100000000以内,且a小于等于b,且b-a<250000。
2 positive integers: a, b. Both a and b are less than or equal 100000000 and a is less than or equal to b, and b - a < 250000.
输出:
[a b]区间内的所有素数,每个单独一行。
All primes in [a, b], each one in a row.
输入样例:
2 5
输出样例:
2
3
5
#include<iostream>
#include<math.h>
using namespace std;
int c[100001];
int d[250001];
int a,b;
void fuzhi();
void shaifa();
void fuzhi2();
void shaifa2();
void output();
int main()
{
cin>>a>>b;
fuzhi();
shaifa();
fuzhi2();
shaifa2();
output();
return 0;
}
void fuzhi()
{
int i;
for(i=0;i<=sqrt(b);i++)
c[i]=1;
}
void shaifa()
{
c[0]=0;
c[1]=0;
int i,j;
for(i=2;i<=sqrt(b);i++)
{
if(c[i]==1)
for(j=2;i*j<=sqrt(b);j++)
{
c[i*j]=0;
}
}
}
void fuzhi2()
{
int i;
for(i=0;i<=b-a;i++)
d[i]=1;
}
void shaifa2()
{
int i,k,l;
for(i=2;i<a;i++)
if(a%i==0)
{
d[0]=0;
break;
}
for(k=2;k<=sqrt(b);k++)
{
if(c[k]==1)
{
l=(a/k)*k+k-a;
for(;l<=b-a;l=l+k)
d[l]=0;
}
}
for(i=a;i<=sqrt(b);i++)
if(c[i]==1)
{
d[i-a]=1;
}
if(a==1)
d[0]=0;
}
void output()
{
int i;
for(i=0;i<=b-a;i++)
if(d[i]==1)
cout<<a+i<<endl;
}