描述
数论是ACM中用途很广的数学分支,而数论里研究得最多的问题,又都和素数相关,所以有人戏称数论为“素论”,也是不无道理的。
输入
输入首先包含一个整数T,表示测试数据组数,T不超过100。然后是T组测试数据,每组测试数据包含两个整数M、N,其中1<=M<=N<=10000000
输出
对于每一组测试数据,请在一行内输出从M到N的所有素数,每个素数之间以逗号分开。
样例输入
3
1 10
1 1
5 7
样例输出
2,3,5,7
5,7
曾纠结于此。
虽然求素数时以sqrt(n)为上界,这仅是判断是合数还是素数的标识,并不代表一个数分解质因数后的所有质因数都小于sqrt(n)。
#include <iostream>
using namespace std;
#define N 10000007
bool prime[N];
void isprime(){
int i,j;
memset(prime,true,sizeof(prime));
prime[1]=false;
for (i=4;i<N;i+=2) //先填偶数
prime[i]=false;
for (i=3;i<3163;i+=2){ //3163*3163>N,3162*3162<N
if (!prime[i])
continue;
for (j=i;j*i<N;j++)
prime[j*i]=false;
}
}
int main(){
int t,a,b,count;
isprime();
cin>>t;
while (t--){
cin>>a>>b;
count=1;
for (;a<=b;a++){
if (prime[a]){
if (count==1)
cout<<a;
else cout<<','<<a;
count=0;
}
}
cout<<endl;
}
return 0;
}
这个题用普通的素数求法会超时的。