首页 新闻 会员 周边

C语言,有关素数

0
[已解决问题] 解决于 2015-11-29 15:59

怎样编写求素数的程序,最小的素数是2,高手指点指点

不是倔强是执著的主页 不是倔强是执著 | 菜鸟二级 | 园豆:203
提问于:2015-11-19 20:06
< >
分享
最佳答案
0

线性筛素数法

#include <stdio.h>
#define N 10000
int n,i,j,ps,pr[N];
bool b[N];
int main()
{
  scanf("%d",&n);
  for(i=2;i<=n;i++)
  {
    if(!b[i]) pr[++ps] = i; // 如果没有被筛除,说明该数为素数,加入素数列表
    for(j=1;j<=ps&&i*pr[j]<=n;j++)
    {
      b[i*pr[j]] = 1; // 筛除当前数与已知素数的乘积
      if(i%pr[j]==0) break;

      // 去除重复,保证时间复杂度(不加上这一句的话答案也正确,但是数据较大时时间延长了几倍)

      // 这么做的原因就是,根据算术基本定理,

      // 合数可以分解成若干不同质因数之积,那么筛除一个合数的方法就有多种,也就是会带来重复计算

      // 所以考虑让每个合数只被最小的那一个质因数筛除

      // 那么,如果i存在质因数pr[j],则大于pr[j]的质数不是i*pr[j]的最小质因数(因为已经有更小的质因数pr[j])

      // 所以这个break可以减少冗余,从而达到时间复杂度上的保证

    }
  }
  for(i=1;i<=ps;i++) printf("%d ",pr[i]);

  // 最终2~n中素数存在pr数组中
  return 0;
}

奖励园豆:5
MoebiusMeow | 菜鸟二级 |园豆:209 | 2015-11-20 19:27
其他回答(2)
0

先明确这个定义 只能被自身和1整除的正整数是素数,1不是素数,2是最小的素数. 求素数进行的操作也就是判断是不是素数的问题
用的比较多的方式是让n按序被2~sqrt(n)之间的数除,如果不能被这区间的任意一个整数整除,则n为素数。

大杯美式不加糖不加奶 | 园豆:994 (小虾三级) | 2015-11-19 21:36
2

题目:判断101-200之间有多少个素数,并输出所有素数。 
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,      则表明此数不是素数,反之是素数。        2.程序源代码: #i nclude "math.h" main() 

 int m,i,k,h=0,leap=1;  printf("\n"); 
 for(m=101;m<=200;m++)   { k=sqrt(m+1); 
   for(i=2;i<=k;i++)      if(m%i==0) 
      {leap=0;break;}    if(leap) {printf("%-4d",m);h++;         if(h%10==0)         printf("\n");         }    leap=1;   } 
 printf("\nThe total is %d",h); 

星星点灯6 | 园豆:164 (初学一级) | 2015-11-20 10:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册