题目描述
输入 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);
}
}
557

被折叠的 条评论
为什么被折叠?



