用筛法求N以内的素数。
思路:一个素数的倍数都是合数。
解决思路1.0:1.初始化check列表(所有元素都是零),命名一个放质数的列表prime(既然数组都开在了前面,就不怕时间超限尽量开大一点,要不然数组溢出,会运行错误)2.由check列表的下标控制倍数关系,变量i为存进prime的数字(从2开始递增),有倍数关系的既不符合题意。
#include<stdio.h>
#include<string.h>
int ind[10000];
int prime[10000];
int qaq=0;
void fo(int n)
{
for(int i=2;i<=n;i++)
{
{
if(!ind[i])
prime[qaq++]=i;
}
for(int j=i*i;j<=n;j=j+i)
{
ind[j]=1;
}
}
}
int main()
{
int n,i;
scanf("%d",&n);
fo(n);
for(i=0;i<qaq;i++)
printf("%d\n",prime[i]);
}
两个列表,一个用下标控制了倍数关系,另一个引进了质数。
解决思路2.0:prime函数判断是否是质数,优化1:平方根以内的数字的倍数涵盖的n以内的合数。优化2:仅用n以内的数字取余。(走投无路就暴力求质数)
#include<stdio.h>
#include<math.h>
void prime(int arr[],int in);
int main()
{
int in;
scanf("%d",&in);
int arr[in+1];
for(int i=0;i<in;i++)
{
arr[i]=i;
arr[1]=0;
}
//将数字放入列表中
prime(arr,in);
int count=0;
for(int i=2;i<in;i++)
{
if(arr[i]!=0){
printf("%d",arr[i]);
count++;
if(count%10==0){
printf("\n");
}
else printf("\t");
}
}
return 0;
}
//筛选法求素数
void prime(int arr[],int n)
{
for(int i=2;i<sqrt(n);i++)
{
for(int j=i+1;j<=n;j++)
{
if(arr[i]!=0&&arr[j]!=0)
if(arr[j]%arr[i]==0)
arr[j]=0;
}
}
return;
}