这是用埃拉托色尼筛选法筛选2~1000的素数的C++程序,能否详细解释一下每个步骤的意思

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这是用埃拉托色尼筛选法筛选2~1000的素数的C++程序,能否详细解释一下每个步骤的意思相关的知识,希望对你有一定的参考价值。

其实题目和解析本身应该是挺清晰了的,估计你是不清楚各个语句的意思,我这里这么写,你看能理解不:

#include<iostream>            //需要用到的头文件(输入输出流)
using namespace std;          //需要用到的命名空间(标准)

int main()               //主方法入口:每个程序必须有且只有一个主方法

 int i,j;               //定义变量(名字其实可以很随便)
 bool prime[2001];           //定义布尔值数组(0到2000是2001个数)

 for(i=2;i<2001;++i)          //因为0和1都不是素数,所以从2开始
  prime[i]=true;            //把数组内所有元素赋值为真(即2~2000全是素数)

 for(i=2;i<1001;++i)          //2~1000逐个数排查(因为最小是2倍,所以到了二分之一之后就没必要检查,因为其2倍必定大于2000
  if(prime[i])             //如果还没有被判定为非素数(即题目里的“合数”)
   for(j=2;i*j<2001;++j)       //从2倍开始,计算出当前数字的所有倍数
    prime[i*j]=false;        //把当前数字的所有倍数判定为非素数

 cout<<"2~2000之内的素数有:"<<endl;  //输出结果前的描述和换行
 for(i=2;i<2001;++i)          //从2开始逐个检查
  if(prime[i])             //如果没有判定为非素数
   cout<<i<<'\\t';           //输出结果,和制表符(一般是三到四个空格的宽度)
 cout<<endl;              //输出结果完成,换行

 return 0;               //因为定义主方法时,定义了其返回整数型值,所以返回一个整数型值

如果还有不明白的问题,请追问。

参考技术A

很简单

程序 从2 开始把所有数设置成素数

0 1 2 3 4 5 6 7 8 9 ..........
x x T T T T T T T T ..........
// 然后 从2 开始 把 整数倍数(2, 3, 4, 5, 6, 7 ... 倍)设置成 F
x x T T F T F T F T ..........
// 然后查找下一个 T的位置,继续这种操作,这时候 是 3的倍数 (2, 3, 4, 5, 6, 7 ... 倍)
x x T T F T F T F F ..........
// 重复直到最后完成
// 剩下 的 T 全部是 素数。

参考技术B 1.你要知道啥是素数?
倍数只有1和他本身的为素数,1不是素数。
2.埃氏筛选是把有倍数的都去掉就好了。
先把1去掉,
再把1000以内2的倍数去掉,
再把1000以内3的倍数去掉,
……
直到剩下的都是倍数只有1和他本身,
即素数。
参考技术C 看不懂

素数筛选法

筛选法(埃拉托色尼(Eratosthenes)筛法)求素数,例如1~100

思想:逐个筛选,直到int(sqrt(100))个

1)因为1不是质数,将1筛去

2)2是质数,将2的倍数全都挖掉

3)3是质数,将3的倍数全都挖掉

4)4已经被挖去,不进行与4相关的操作

5)5是质数,将5的倍数全都挖掉

6)这个过程一直进行到后面的数全都挖掉为止

不是从1开始:如10~18----一个一个筛--->18

#include <stdio.h> 
#include <math.h>
#include <stdlib.h>
//#include <string.h>
int isprime(int n)
{
    int i;
    if(n == 1)
        return 0;
    for(i=2;i<(int)sqrt(n);i++)
        if(n%i == 0)
            return 0;
    return 1;
}
int main()
{
    int n,i,j;
    scanf("%d",&n);
    int *num = (int*)malloc(sizeof(int)*(n+1));
    //memset(num,0,n+1);//不能将动态开辟的数组数都初始化为0
    for(i=1;i<=n;i++)
        num[i] = 0;
    //挖数
    num[1] = 1;
    for(i=2;i<=(int)sqrt(n);i++) 
    {
        if(!num[i])
        {
            if(isprime(i))
            {
                for(j=2*i;j<=n;j++)    //挖掉质数的倍数的数 
                    if(j%i == 0)
                        num[j] = 1;
            }
        }
    }
    for(i=1;i<=n;i++)
        if(!num[i])
            printf("%d ",i);
    printf("\n");
    return 0;
}

 

以上是关于这是用埃拉托色尼筛选法筛选2~1000的素数的C++程序,能否详细解释一下每个步骤的意思的主要内容,如果未能解决你的问题,请参考以下文章

埃拉托色尼筛选法的介绍

埃拉托色尼筛选法的C++实现

埃拉托色尼筛选法的步骤

关于埃拉托色尼筛选法的整理(质数问题)

c语言中用筛选法求素数

leetcode实战—素数(埃拉托色尼筛选法包括证明哈希RSA)