题目描述
输入 n 个不大于 10^5 的正整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。
输入格式
第一行输入一个正整数 n,表示整数个数。
第二行输入 n 个正整数 ai,以空格隔开。
输出格式
输出一行,依次输出 ai 中剩余的质数,以空格隔开。
样例 #1
样例输入 #1
5 3 4 5 6 7
样例输出 #1
3 5 7
提示
数据保证,1< n <100,1 < ai < 10^5。
题解
这很明白可以看出是一个判断是否为质数的题,题也不难,不过有很多种办法去解答他。
第一种,是最普通的一种,也是从定义出发去判断一个数是否为质数。
#include<stdio.h> int main() { int n; scanf("%d",&n); while(n--) { int a,flag=1; scanf("%d",&a); if(a==1) //特别注意最小的质数是2 flag=0; for(int i=2;i*i<=a;i++) if(a%i==0) { flag=0; break; } if(flag==1) printf("%d ",a); } }
第二种,埃氏筛法。
#include<stdio.h> #include<math.h> int a[100000]={1,1}; int aishi(int x) { int k=0; for(int i=2;i<x;i++) { if(a[i]==0) for(int t=2*i;t<x;t+=i) //质数的倍数一定不是质数 a[t]=1; } } int main() { int n; scanf("%d",&n); aishi(100000); while(n--) { int y,flag=1; scanf("%d",&y); if(a[y]==0) printf("%d ",y); } }
第三种,欧拉筛法。
这个需要在埃氏筛法的基础上理解。
#include<stdio.h> #include<math.h> int a[100000]={1,1}; int b[100000]; //记录质数 int oula(int x) { int k=0; for(int i=2;i<x;i++) { if(a[i]==0) b[++k]=i; for(int t=1;t<=k;t++) { if(i*b[t]>100000) break; a[i*b[t]]=1; if(i%b[t]==0) //排除重复的赋值 break; } } } int main() { int n; scanf("%d",&n); oula(100000); while(n--) { int y,flag=1; scanf("%d",&y); if(a[y]==0) printf("%d ",y); } }