《算法笔记》第4章 入门篇(2)---算法初步 5.4素数

本文介绍了素数的概念,详细讲解了如何判断一个数是否为素数,包括通过循环长度从i=2到sqrt(n)的判断方式,以及循环设置从i=2到i**<=n的方法。此外,还提供了使用isprime()函数求100以内素数的简约代码和利用筛法获取100以内所有素数的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是素数:

除了自身和1之外没有其他因子,则称为素数

5.4.1 素数的判断:

1.就是循环的长度从i=2~~i<=sqrt(n)的代码:

bool isPrime(int n)
{
    if(n<=1)
        return false;    //n<1叫做待判断
    for(int i=2; i<=(int)sqrt(1.0*n); i++)   //遍历2~~sqrt(n)
    {   //由于sqrt的参数需要浮点数,所以必须给n*小数
        if(n%i==0)        //如果n能把i整除,则立马返回false
        return false;
    }
    return true;     //n为素数
}

2.循环的设置是从i=2~~~i**<=n

bool isPrime(int n)
{
    if(n<=1)
        return false;    //n<1叫做待判断
    for(int i=2; i*i<=n; i++)   //遍历2~~sqrt(n),这种写法把i设置为long long类型
    { 
        if(n%i==0)        //如果n能把i整除,则立马返回false
        return false;
    }
    return true;     //n为素数
}

3.用判断素数函数isprime()求100以内的所有素数,简约代码:

const int maxn=101;    //要求输出1--100的素数,所以最大值设置为101
int prime[maxn]={0},PNum=0;
bool P[maxn]={0};    //p[i]==true表示i为素数
void Find_Prime()
{
    for(int i=1; i<maxn; i++)        //从1--100遍历循环,不能写成i<=maxn
    {
        if(isprime(i)==true)    //如果i为素数,则把它放到数组prime中,然后将p[i]的值设为true
        {
            prime[PNum++]=i;
            p[i]=true;
        }
    }
}

//完整的代码:
#include<iostream>
#include<cmath>
using namespace std;
bool isprime(int n)
{
    if(n<=1)
        return false;
    for(int i=2; i<=(int)sqrt(1.0*n); i++)  //不要忘记这里i=2开始,一直到i<=sqrt(n)
        if(n%i==0)
            return false;
    return true;
}
const int maxn=101;
int prime[maxn]={0},pNume=0;
bool p[maxn]={0};
void Find_Prime()
{
    for(int i=2; i<maxn; i++)
    {
        if(isprime(i)==true)
        {
            prime[pNume++]=i;
            p[i]=true;
        }
    }
}
int main()
{
    Find_Prime();
    for(int i=2; i<maxn; i++)
    {
        if(p[i]==true)
            cout << i << " ";
    }
    return 0;
}

在这里插入图片描述

4.用筛法求100以内的所有素数,简约代码:

const int maxn=101;  //表长
int prime[maxn]={0},pNum=0; //prime数组存放所有素数,pNum表示素数个数
bool p[maxn]={0};    //如果素数时i,则p[i]为false,否则为true
void Find_Prime()
{
    for(int i=2; i<maxn; i++)   //i从2开始,不要到maxn
    { 
        if(p[i]==false)     //如果i是素数
        {
            prime[pNum++]=i;      //则将素数保存在prime中
            for(int j=i+i; j<maxn; j+=i)  //将所有i的倍数全设置为非素数
                p[j]=true;             
        }
    }
}

//完整的代码:
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=101;  //表长
int prime[maxn]={0},pNum=0; //prime数组存放所有素数,pNum表示素数个数
bool p[maxn]={0};    //如果素数时i,则p[i]为false,否则为true
void Find_Prime()
{
    for(int i=2; i<maxn; i++)   //i从2开始,不要到maxn
    {
        if(p[i]==false)     //如果i是素数
        {
            prime[pNum++]=i;      //则将素数保存在prime中
            for(int j=i+i; j<maxn; j+=i)  //将所有i的倍数全设置为非素数
                p[j]=true;
        }
    }
}
int main()
{
    Find_Prime();
    for(int i=2; i<maxn; i++)
    {
        if(p[i]==false)
            cout << i << " ";
    }
    return 0;
}

在这里插入图片描述

5.4.1 素数表的获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值