素数筛法——找出范围内所有素数

基本原理:发现一个素数后,该素数的所有倍数均为非素数。
通过这个办法,从素数2开始,不断将非素数标记出来,没有被标记的就是素数,从而逐步筛出素数。(注意:1不是素数)
在这里插入图片描述

/*利用素数筛法求出一段范围内的素数*/
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;

int num[10005];  //非素数为1,素数为0
int sushu[3000];
int numSu = 0;  //记录素数个数


//核心代码:素数筛法
void init()
{
    for(int i=2;i<=10001;i++){
        if(num[i] == 1) continue;  //不是素数,下一个
        else{   //若没有被标记为1,则说明它是素数,不需要专门验证
            sushu[++numSu] = i;
            //得到新素数后,将更多未知的数确定为非素数
            for(int j=i*i;j<=10002;j+=i){
                num[j] = 1;
            }
        }
    }
}

int main()
{
    init();  //得到1~10000之间所有素数,注意:1不是素数!!!
    int x;
    scanf("%d",&x);
    for(int i=1;i<=numSu;i++){
        if(sushu[i]<x && sushu[i]%10==1){
            cout<<sushu[i]<<" ";
        }
    }
    return 0;
}

通过素数筛法,可以对数字进行质因数分解,如下例题:
在这里插入图片描述

/*求正整数素因数的个数*/
#include <iostream>
#include <stdio.h>
using namespace std;

//素数找到10^5即可
int num[100005];  //素数为0
int sushu[10000];
int numSu;
long long int n;  //输入数据
int ans;
void init()
{
    for(int i=2;i<=100002;i++){
        if(num[i] == 1) continue;
        else if(i>1000) continue;
        else{
            sushu[++numSu] = i;
            for(int j=i*i;j<=100002;j+=i){
                num[i] = 1;
            }
        }
    }
}

int main()
{
    init();
    scanf("%d",&n);
    int i=1;
    while(n!=1){
        while(n%sushu[i] == 0){
            n = n/sushu[i];
            ans++;
        }
        i++;
    }
    cout<<ans;
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值