zoukankan      html  css  js  c++  java
  • 求质数(素数)的方法

    质数是数学重要的一环,所谓质数,就是除了1和它本身外不存在任何因子的数。以下整理了一下c语言中质数的求法。

    问题:输入一个正整数n(n>=2),求不大于n的全部质数

    方法一:循环法

    思路:判断一个数n是不是质数,可以用2到√n之间的所有整数去除n,如果都不能整除,那么n是质数。设计循环嵌套时尽量跳过一些不必要的情况。

    1."2"为必输出的质数,可以单独输出。这样循环可从3到√n判断。

    2.为什么只需要判断到√n的数呢?

        因为n=√n*√n,n的因数除了√n,其他都是成对存在的,且必定一个大于√n一个小于√n,假设n不是质数,有个因数大于√n(不是n本身),则n必定有一个与之对应的小于√n的因数。

    3.除了2以外,不存在是偶数的质数,所以在设计循环时可以设置步数step为2。

    代码:

     1 #include<stdio.h>
     2 int main()
     3 {
     4     int n;
     5     scanf("%d",&n);
     6     printf("2
    ");
     7     for(int i=3;i<=n;i+=2)
     8     {
     9         for(int m=3;m<i;m+=2)
    10         {
    11             if(i%m==0 || m*m>i)
    12                 break; 
    13         }
    14         if(m*m>i)
    15             printf("%d
    ",i);
    16     }
    17 
    18     return 0;
    19 }

    输入:100

    运行结果:

    方法二:筛法(空间换时间)

    思路:把2到n中的所有数都列出来,然后从2开始,先筛去n内所有2的倍数,然后每次从下一个剩下的数(必然为质数)开始,筛去其n内所有的倍数,最后剩下的数都是质数。

    1.设置一个数组a[],a[i]的值为1表示i为质数,将所有元素初始化为1

    2.筛去m的倍数,即把a[2*m]、a[3*m]…置为0

    3.输出a[i]值为1的i。

    代码:

     1 #include<stdio.h>
     2 #define MAX 100
     3 int s;
     4 int a[MAX];
     5 void prime()
     6 {
     7     s=1;
     8     for(int i=0;i<=MAX;i++)
     9         a[i]=1;
    10     a[0]=a[1]=0;
    11     for(int i=2;i<=MAX;i++)
    12     {
    13         if(a[i])
    14             a[s++]=i;
    15         for(int j=i*2;j<=MAX;j+=i)
    16             a[j]=0;
    17     }
    18 }
    19 int main()
    20 {
    21     prime();
    22     for(int i=1;i<s;i++)
    23         printf("%d
    ",a[i]);
    24     return 0;
    25 }

    MAX设置值:100

    运行结果:

     

    可以看出,两种方法都成功得到了结果。

  • 相关阅读:
    DRY原则和Shy原则
    GEO LBS服务
    Intellij IDEA转换类图、时序图
    使用HttpMessageConverter实现HTTP的序列化和反序列化
    通过@Valid注解对请求主体中的参数进行校验
    Java-Enumeration ( 枚举类)
    SPI的实现原理
    python批量获取gitlab里面所有项目的代码
    浙江省高等学校教师教育理论培训上机考试小程序设计架构
    springboot~使用freemaker模版进行部署
  • 原文地址:https://www.cnblogs.com/kaml8/p/9517483.html
Copyright © 2011-2022 走看看