(数学知识)试除法判断质数,分解质因数,埃式与线性筛质数

news2024/10/5 15:02:33

质数

  1. 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

试除法判定质数

  1. 你会发现如果说一个数要分成两个数相乘的话,那么这两个数肯定都是成对出现的,有一大一小的相对关系。因此不需要从2遍历到n,循环的时候应该这样去写:
    在这里插入图片描述
for (int i=2;i<=n/i;i++)

经典例题

luck
在这里插入图片描述

#include <stdio.h>
#include <stdbool.h>
int n;
bool is_prime(int num)
{
    if (num<2)
    {
        return false;
    }
    for (int i=2;i<=num/i;i++)
    {
        if (num%i==0)
        {
            return false;
        }
    }
    return true;
}
int main()
{
    scanf("%d",&n);
    for (int i=0;i<n;i++)
    {
        int num=0;
        scanf("%d",&num);
        if (is_prime(num)==true)
        {
            printf("Yes\n");
        }
        else
        {
            printf("No\n");
        }
    }
    return 0;    
}

分解质因数

  1. 对于分解质因数而言,每个质因数都有底数和指数,这两个概念必须得了解清楚
    在这里插入图片描述
  2. 首先必须得知道一点性质:对于一个数n而言,大于根号n的质因数有的话也只有一个,如果但凡出现两个以上的话,那么他们相乘就会大于n。所以我们先考虑是因数小于等于根号n的情况。那所以for循环的话就这样写:
for (int j=2;j<=x/j;j++)
  1. 然后上面这个for循环相当于就是去遍历一下小于等于根号n的每一个数,然后这个数如果能被整除(并且很容易就知道,最开始被整除的那个数必定是一个质数)的话,那么我们就在这个原数当中不断地去剔除这个质数,在这个过程当中指数不断的去++。然后直到这个质数在原数当中被剔除的不能再剔除了,这时候首先输出一对底数与指数,然后再继续进行for循环,要注意的是,由于在不断的剔除质数的过程当中,这个原数也自己在不断的坍塌缩小,所以说这个for循环已经变得更加容易结束。
for (int j=2;j<=x/j;j++)
{
    if (x%j==0)
    {
        int s=0;
        while(x%j==0)
        {
            s++;
            x/=j;
        }
        printf("%d %d\n",j,s);
    }
}
  1. 然后我们再去判断一下大于根号n的那个范围内是否存在那么孤独的一个质因数,可能存在,也有可能不存在。这时候就拿已经被削弱的原数去和1比较一下,如果大于1的话,那这时候就说明还存在着一个质因数,注意:一定是要大于1才可以。1的话本身并不是一个质因数。
if (x>1)
{
    printf("%d %d\n",x,1);
}

经典例题

luck
在这里插入图片描述

#include <stdio.h>
int n;
void divide(int num)
{
    for (int i=2;i<=num/i;i++)
    {
        if (num%i==0)
        {
            int s=0;
            while(num%i==0)
            {
                s++;
                num/=i;
            }
            printf("%d %d\n",i,s);
        }
    }
    if (num>1)
    {
        printf("%d %d\n",num,1);
    }
}
int main()
{
    scanf("%d",&n);
    for (int i=0;i<n;i++)
    {
        int num=0;
        scanf("%d",&num);
        divide(num);
        printf("\n");
    }
    return 0;
}

埃式筛法筛质数

  1. 首先如果要筛选质数的话,需要开两个数组,第一个数组就是用来存放筛选出来的质数,第二个数组是一个布尔数组,它的下标就是用来记录筛选的范围(如从1到n当中筛选质数),然后它的内容也就是布尔值,就是用来记录当前下标值这个数是不是质数
bool st[N];//默认为false表示里面的数默认全部是质数
int primes[N];
int cnt;
  1. 这个算法的核心就在于首先对于筛选范围进行一次for遍历,对于每一次for循环,去判断一下当前这个数是不是一个质数,如果说当前这个数不是质数,就什么都不用去处理;如果当前这个数被标识为是一个质数的话,我就先把它加入到结果数组当中,然后这个质数的倍数肯定不可能将会再是质数,说就把这个质数的倍数质数标识情况给他更新一下,也就是都给他计为不是质数,到时候在后面遍历到他们的时候就什么都不用去处理。
    在这里插入图片描述

经典例题

luck
在这里插入图片描述

#include <stdio.h>
#include <stdbool.h>
#define N 1000010
bool st[N];//默认为false表示里面的数默认全部是质数
int primes[N];
int cnt;
int n;
int main()
{
    scanf("%d",&n);
    for (int i=2;i<=n;i++)
    {
        if(st[i]==false)
        {
            primes[cnt++]=i;
            for (int j=i+i;j<=n;j+=i)
            {
                st[j]=true;
            }
        }
        
    }
    printf("%d\n",cnt);
    return 0;
}

线性筛法筛质数

  1. 上面这种埃式筛法会发现有一个明显的不好的地方就在于,对于好几个数都是给他筛除掉了多次,是给他重复删除了,这个重复操作是没有必要的。于是再进行一些优化就有了线性筛法。线性筛法的最核心的地方就在于:就是让一个合数的最小质因数去筛除掉它,必须是要让一个合数的最小质因数去筛除它,这么一来的话每一个合数都只被筛除掉了一次,就没有重复操作了。
  2. 仍然是与刚才的算法一样,先开两个数组,一个数组就是用来记录一下筛选出来的质数,另一个数组就是来记录一下每一个数的是否是质数情况
int primes[N];
int cnt;
bool st[N];
  1. 首先也是与刚才上面一样对整个筛选范围进行一次for循环遍历,然后如果说这个数是质数的话,把他加入到结果数组当中,然后接下来的操作就是无论你这个数是不是质数都必须要进行的一个操作
for (int i=2;i<=n;i++)
{
    if (st[i]==false)
    {
        primes[cnt++]=i;
    }
    //....
}
  1. 下来就是整个算法最为关键的地方,因为线性筛法的话就是让一个合数的最小质因数去筛除掉它,而不是用其他的数字。这时候就去遍历一下这个结果数组(里面存放的就是已经被筛选出来的质数,且是从小到大),然后把这些质数乘上倍数i所得到的一个合数就给他标记为不是质数,然后这边最为关键的一个地方就在于,当去修改完一个合数的质数标记后,就去判断一下这个i能否可以整除当前这个结果数组当中的质数,如果说可以被整除的话,那这时候就应该被停下来:在这里插入图片描述
for (int i=2;i<=n;i++)
{
    if (st[i]==false)
    {
        primes[cnt++]=i;
    }
    for (int j=0;primes[j]<=n/i;j++)
    {
        st[primes[j]*i]=true;
        if (i%primes[j]==0)
        {
            break;
        }
    }
}
  1. 最后解释一下上面代码当中第二个for循环的结束条件为什么是这样子的,你可以把它理解成为了使得primes[j] 最后呈上一个这个数值i必须是要在筛选的范围之内,那会不会这个j会可能超出这个cnt呢?实际上是不会的。
for (int j=0;primes[j]<=n/i;j++)

经典例题

luck
在这里插入图片描述

#include <stdio.h>
#include <stdbool.h>
#define N 1000010
bool st[N];//默认为false表示里面的数默认全部是质数
int primes[N];
int cnt;
int n;
int main()
{
    scanf("%d",&n);
    for (int i=2;i<=n;i++)
    {
        if (st[i]==false)
        {
            primes[cnt++]=i;
        }
        for (int j=0;primes[j]<=n/i;j++)
        {
            st[primes[j]*i]=true;
            if (i%primes[j]==0)
            {
                break;
            }
        }
    }
    printf("%d\n",cnt);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/477464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI智能课程:第七讲-不会写代码?有chatGPT不用慌

chatGPT辅助自动化测试-常见用途 根据代码写需求 作为python编程小白&#xff0c;如何安装python环境 ### 怎么用python发送http请求 如何在http请求中&#xff0c;请求头带上token值&#xff0c;怎么发送请求 websrvice协议&#xff0c;用python语言基于websrvice发送请求…

【数据结构】第十三站:排序(下)归并排序

文章目录 一、归并排序递归法1.归并排序的基本思想2.归并排序的代码实现 二、归并排序非递归1.可否使用栈来模拟&#xff1f;2.直接改非递归(简化版)3.处理边界之一把梭哈4.处理边界之归并一次拷贝一次 一、归并排序递归法 1.归并排序的基本思想 归并排序&#xff08;MERGE-SO…

网络安全事件调查,如何追溯攻击者的行踪和攻击路径

在当今互联网的世界里&#xff0c;网络安全已成为一个非常重要的话题。随着网络攻击的不断增加&#xff0c;如何保护我们的网络安全已成为一个严峻的挑战。为了防止网络攻击&#xff0c;需要了解攻击者的行踪和攻击路径&#xff0c;以便更好地预防和应对网络攻击。 网络安全事…

SQLite 用C语言开发的原因有哪些?

SQLite 用C语言开发的原因有哪些&#xff1f; 一、引言1.1、SQLite是什么&#xff1f;1.2、SQLite的历史和现状 二、SQLite的优点三、使用C语言开发SQLite的原因3.1、C 语言的优势3.2、对比其他编程语言 四、SQLite与其他数据库的对比4.1、关系型数据库MySQL4.2、关系型数据库P…

Python小姿势 - 线程和进程:

线程和进程&#xff1a; Python里面线程是真正的并行执行&#xff0c;进程是可以并行执行的。 所谓进程&#xff0c;就是操作系统中执行一个程序的独立单元&#xff0c;它是系统进行资源分配和调度的基本单位。一个进程可以创建和撤销另一个进程&#xff0c;同一个进程内可以并…

Vue电商项目--axios二次封装

postman测试接口 刚刚经过postman工具测试&#xff0c;发现接口果然发生了改变。 新的接口为http://gmall-h5-api.atguigu.cn 如果服务器返回的数据code字段200&#xff0c;代表服务器返回数据成功 整个项目&#xff0c;接口前缀都有/api字样 axios二次封装 XmlHttpRequ…

EMC VPLEX VS2 FRU故障备件更换基本流程

本文是针对VPLEX VS2 备件更换流程的详细操作方法&#xff0c;其实VS6也是类似的。 首先要说明一点&#xff0c;EMC VPLEX的任何硬件故障更换都不是直接插拔来完成的&#xff0c;一定要执行脚本要完成更换&#xff0c;本文就是描述如何启动这个脚本和常见的一些问题&#xff0…

【react从入门到精通】初识React

文章目录 前言React技能树什么是 React&#xff1f;安装和配置 React创建 React 组件渲染 React 组件使用 JSX传递属性&#xff08;Props&#xff09;处理组件状态&#xff08;State&#xff09;处理用户输入&#xff08;事件处理&#xff09;组合和嵌套组件写在最后 前言 Reac…

群晖传输速度的问题

1、群晖被称“买软件送硬件”&#xff0c;所以同价位NAS中群晖的配置是很低的&#xff0c;一些入门级型号用起来明显卡顿就一点不奇怪了。 群晖各版本的CPU/内存配置可用在官网上查到&#xff0c;一个页面列出了所有产品的CPU/内存配置: 我的 Synology NAS 使用哪种 CPU&#…

【五一创作】Python 一文了解 OS 操作系统交互库简单使用方法

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,YOLO领域博主爱笑的男孩。擅长深度学习,活动,YOLO,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect个人…

linux系统下C/C++静态库和动态库的制作及使用

C/C静态库和动态库的制作及使用 1 静态库的制作静态库简介1.1 编写源码1.2 生成目标文件1.3 ar归档,打包成静态库1.4 查看静态库1.5 测试静态库1.6 运行测试 2 动态库2.1 编写 Makefile2.2 编译链接动态库 1 静态库的制作 静态库简介 一般情况下&#xff0c;为了更好的支持开…

LC正弦波振荡器【高频电子线路】【Multisim】

目录 一、实验目的与要求 二、实验仪器 三、实验内容与测试结果 1、观察起振过程 2、观测稳定的输出波形及振荡频率的变化 3、测试静态工作点对起振和输出幅度的影响 4、测试回路电容对振荡频率和输出幅度的影响&#xff0c;并理论上给出解释 四、实验结果分析 一、实验…

【社区图书馆】【图书活动第四期】

目录 一、前言 二、作者简介 三、《PyTorch高级机器学习实战》内容简介 四、书目录 一、前言 今天&#xff0c;偶尔逛到csdn社区图书馆&#xff0c;看到有活动 “【图书活动第四期】来一起写书评领实体奖牌红包电子勋章吧&#xff01;”&#xff08;活动到今天结束&#xf…

荔枝派Zero(全志V3S)开启 SSH 实现远程连接和文件传输

文章目录 前言一、配置 buildroot二、编译 buildroot三、拷贝到 SD 卡四、测试 ssh1、修改 /etc/ssh/sshd_config 文件2、运行 /usr/sbin/sshd3、使用 SecureCRT 测试4、使用 SecureFx 测试 前言 本文将在 Buildroot 根文件系统开启 ssh 功能。 一、配置 buildroot 1、在 bui…

《软件测试》[Ron Patton](一)-软件测试背景、软件开发过程、软件测试基础

《软件测试&#xff08;原书第2版&#xff09;》作者: [美] Ron Patton 这本书是软件测试入门的经典书籍。我在刚入行时&#xff0c;也读过这本书&#xff0c;受益匪浅。并且即使是工作了这么多年&#xff0c;再回头看这本书&#xff0c;会发现怎么都逃不出这本书的范围。这个系…

【视频教程解读】Window上安装和使用autogluon V0.4

1.使用conda安装的python环境 教程使用的是极简版miniconda,由于我们的电脑中安装了anaconda&#xff0c;所以不需要进行进一步安装。python版本为3.9&#xff0c;博客里面有anaconda和python版本的对应关系。注意查看版本autogluon V0.4需要3.8或者3.9和3.10&#xff0c;pip版…

Linux:网络基础1

网络协议分层 所有网络问题&#xff0c;本质都是通信距离变长了&#xff0c;为了尽可能减少通信成本&#xff0c;定制了协议。 协议分层的优势&#xff1a; 软件设计方面的优势 - 低耦合 一般我们的分层依据: 功能比较集中&#xff0c;耦合度比较高的模块-- 一层 &#xff0c…

【Vue 基础】尚品汇项目-03-home首页搭建(全局组件与局部组件)

1. 完成三级联动组件&#xff08;全局组件&#xff09; 由于三级联动组件在Home、Search、Detail中都需使用&#xff0c;因此将三级联动组件作为全局组件&#xff0c;这样只需要注册一次&#xff0c;就可以在项目任意地方使用。 新建“home/TypeNav/index.vue”&#xff0c;写…

深度学习技巧应用10-PyTorch框架中早停法类的构建与运用

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用10-PyTorch框架中早停法类的构建与运用,文章将介绍深度学习训练过程中的一个重要技巧—早停法,以及如何在PyTorch框架中实现早停法。文章将从早停法原理和实践出发,结合实际案例剖析早停法的优缺点及在PyTorch中的应…

[创新工具和方法论]-02- DOE实验设计步骤

文章目录 1.DOE设计1.1 基于OFAT的传统实验设计&#xff1a;1.2 基于DoE的现代实验设计&#xff1a;1.3 DOE和OFAT的比较1.4 如何利用好DOE1.4.1 规划1.4.2 筛选1.4.3 表征1.4.4 优化1.4.5 确认 2. 步骤2.1陈述实际的问题和实验的目的2.2因果链分析,提取重要的因子2.3选择Y的响…