首页 > 其他分享 >..质数..

..质数..

时间:2024-07-11 20:56:14浏览次数:15  
标签:prime 质因数 .. int 质数 因数 include

先弄清楚我们在上小学时 学的概念。

1、什么是质因数?
     -质因数是指能够整除给定正整数的质数。每个正整数都可以被表示为几个质数的乘积,这些质数就是该数的质因数。质因数分解是将一个正整数分解成若干个质数相乘的过程。例如,数字 12 的质因数分解是 2 × 2 × 3,因此 2 和 3 是 12 的质因数。

2、什么是质因数的底数与指数?
      -底数(Base):指的是质因数分解中的质数。这些质数是构成原数的不可再分的基本元素。例如,在质因数分解12的过程中,底数是2和3,因为12可以分解为2和3的乘积。
      -指数(Exponent):指的是在质因数分解中,每个质因数出现的次数。指数表示该质因数在原数中的“数量”。例如,数字12可以分解为 22×3122×31,这里2的指数是2,表示质因数2出现了两次;3的指数是1,表示质因数3出现了一次。

3、什么是合数?
      -合数是一个大于1的自然数,它不是质数,也就是说,它除了1和它本身以外,至少还有一个正因数。换句话说,合数可以被分解为两个或更多较小的正整数的乘积。合数的判定方法通常是通过检查一个数是否有除了1和它本身以外的因数。如果一个数可以被除了1和它本身以外的任何数整除,那么这个数就是合数。

4、什么是因数?
      -因数是指能够整除给定正整数的数。换句话说,如果一个数b能够被另一个数a整除,那么b就是a的因数。因数通常是指除了1和它本身以外的因数,因为1是所有正整数的因数。

质数

质数的判断

在判定一个数是否为质数时常用试除法

题目:866. 试除法判定质数 - AcWing题库

代码:

复杂度是严格的O(sqrt(n))

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=105;
int n,a[N];

bool check_prime(int x)
{
    //1不是质数
    if(x<2) return false;
    //对于一个非质数的数而言,一定含有两个因数,所以只要枚举较小的那一个即可
    for(int i=2;i<=x/i;i++)
        {
            if(x%i==0) return false;
        }
    return true;
}

int main()
{
    cin >> n;
    for(int i=0;i<n;i++)
    {
        cin >> a[i];
        if(check_prime(a[i])) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
    return 0;
    
    
}

这里的 判定条件写为i <= x/i 而不写成i <= sqrt(x) 的原因是因为后者效率低,不写成i*i <= x 原因是因为防止i*i时溢出

分解质因数


分解质因数——试除法(O(sqrt(n))——>O(log2(n))~O(sqrt(n)))
从小到大枚举所有数

for(int i=2;i<=n;i++)
    if(n%i==0)
    {
        int s=0;
        while(n%i==0)
        {
            n/=i;
            s++;
        }
        cout << i << s << endl;
    }


在这里枚举的是所有因数,而不是枚举的所有质因数。
原因就是在枚举所有数的过程中,当枚举到i的时候,2~i-1之间的i的所有因数都被除干净了
所以这里所枚举的就是质因数。例如n=8的时,i=2就会把n置于0,枚举到i=4的时候已经n已经=1了。

由于n当中最多只包含一个大于sqrt(n)的质因子,即它本身
所以代码为:

for(int i=2 ;i <= n/i;i ++ )
    if(n%i==0)
    {
        int s=0;
        while(n%i==0)
        {
            n/=i;
            s++;
        }
        cout << i << s << endl;
    }
  if(n>1) cout << n << 1 << endl;
题目:867. 分解质因数 - AcWing题库

代码:

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

int n,a[105];

void print_prime(int x)
{
    for(int i=2;i<=x/i;i++)
    {
        if(x%i==0)
        {
            int s=0;
            //求底数的质数
            while(x%i==0)
            {
                //这里如果质因数的质数不唯一,那么就逐个舍弃
                x/=i;
                s++;
            }
            cout << i << ' ' << s << endl;
        }
    }
    //经过上述质因数的分解后,x>1的话,那么x就是一个质数。比如17、19...经过上述循环仍为它本身
    if(x>1) cout << x  << ' ' << 1 << endl;
    //注意题目要求的格式
    cout << endl;
    
    return;
}

int main()
{
    cin >> n;
    for(int i=0;i<n;i++)
    {
        cin >> a[i];
        print_prime(a[i]);
    }
    
    return 0;
}

筛质数 

两种算法,

1、朴素筛法:对2~n-1的数的倍数做标记,那么剩余没有被标记的即为质数。因为剩余的也就没有因子。

贴个图,一目了然

 板子:
void get_prime(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!st[i])
        {
            prime[res++]=n;
        }
        
        for(int j=i+i;j<=n;j+=i) st[j]=true;
    }
}

对朴素筛选的优化 ——埃氏筛 
 在筛选过程中只用质数去筛,因为一个数最小的因数就是质因数,证明:一个数的除了1之外最小的因数一定是质数吗?为什么?_百度知道 (baidu.com)

板子:
void get_prime(int n)
{
    for(int i=2;i<=n;i++)
    {
        //如果被筛选后仍为false,则为质数
        if(!st[i])
        {
            res++;
            for(int j=2*i;j<=n;j+=i) st[j]=true;
        }
        
    }
}

缺点:无论怎样优化都会有数被多次标记,进而增加复杂度

2、线性筛

用每个合数只会被最小的质因数筛掉。因为每个数的最小质因数只有一个,所以每一个数只会被筛一次,所以总体为线性。

板子:
void get_prime(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(!st[i]) a[res++]=i;
        for(int j=0;a[j] <= n/i;j++)
        {
            st[a[j]*i]=true;
            if(i%a[j]==0) break;
        }
        
    }
}
题目:868. 筛质数 - AcWing题库

代码:
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int n,res,a[1000010];
//开个bool数组来记录当前数是否为质数
bool st[1000010];

void get_prime(int n)
{
    for(int i=2;i<=n;i++)
    {
        //如果被筛选后仍为false,则为质数,我们就将其记录下来。
        if(!st[i]) a[res++]=i;
        //每一个数只会被它的最小质因子筛去
        //枚举每一个质数
        for(int j=0;a[j] <= n/i;j++)
        /*
        这里a[j]退出循环的条件我们展开来看:a[j]*i<=n如果a[j]再增加,那么a[j]*i的值
        就会>n,筛n之外的非质数对于题干要求来说没什么意义
        */
        {
            /*
            比如这里的i=27,那么在第一次会把st[2*27]筛出去,第二次把st[3*27]筛出去
            第三次把st[5*27]但是第三次的筛选是没有任何意义的
            因为5*27=45*3;所以5*27应该由它的最小质数3所筛去
            */
            st[a[j]*i]=true;
            //如果i%a[j]==0那么a[j]一定是i的最小质因子,如果不break掉,那么一定会造成后续的数重复被标记
            if(i%a[j]==0) break;//a[j]一定是i的最小质因子,因为a[i]是从小到大进行枚举
        }
        
    }
}

int main()
{
    cin >> n;
    
    get_prime(n);
    
    cout << res << endl;
    return 0;
}

 

标签:prime,质因数,..,int,质数,因数,include
From: https://blog.csdn.net/2301_80358171/article/details/140361143

相关文章

  • insert into....select从一个数据库的表中导入到另一个数据库的表中
    说明已知条件:有两台oracle数据库,ora1和ora2,ora1的表中有数据(ip:192.0.0.1,表名table1,用户名和密码:yth(有管理员的权限),数据库服务名:orcl),需要导入ora2中(ip:192.0.0.2,表名table2,用户名和密码:ythcj(有管理员的权限),数据库服务名:orcl)。1.在ora2中建立数据库的链接指向ora1(需要有管理员......
  • Lbview调用python脚本报错:错误1667...无法导入指定的python模块
    前提注意:NILabVIEW2021(32位)Python3.9.10(32位)32位对应32位,64位同理,否则可能会报错报错的原因:LabVIEW中使用的Python环境与安装的Python包不匹配也就是说Labview中使用的是python版本安装的系统路径,而PyCharm使用的虚拟环境路径,它的包都是下载到项目文件夹内可......
  • Failed to configure a DataSource: 'url' attribute is not specified and no embe..
    原文链接: https://www.cnblogs.com/javawxid/p/10949511.html问题原因:Mybatis没有找到合适的加载类,其实是大部分spring-datasource-url没有加载成功,分析原因如下所示.DataSourceAutoConfiguration会自动加载.没有配置spring-datasource-url 属性.spring......
  • spark程序在hdfs集群执行,提示: “main“ org.apache.spark.SparkException: Failed to
    1.执行代码spark在hadoop上以集群模式执行代码bin/spark-submit\--masteryarn\--deploy-modecluster\--executor-memory1G\--total-executor-cores2\/root/word_count_cluster.py2.错误截图错误原因:找不到spark目录3.解决办法在/etc/profile文件中配置spa......
  • Maven工程下:alibaba fastjson2的各种序列化:java对象转json对象、json对象转java对象
    pom文件导入fastjson2坐标:<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.51</version></dependency>UserVO对象:@Data@AllArgsConstructor......
  • 近似排序......
    一年没动算法的蒻蒟随手点开了之前做过的一道【近似排序】,然后开始了,恢复之旅......TFLSOJ【近似排序】看到题目经简单分析后先写出了一种傻瓜解法,(可能叫暴力??)#include<bits/stdc++.h>usingnamespacestd;intx,y;inta[110];intmain(){ cin>>x>>y; for(inti=x,j=1......
  • 找出100以内的所有素数(质数)?100000以内的呢?
    一.前言        本文介绍多种方式来实现“找出100以内的所有素数(质数)?100000以内的呢?”的需求。各种方式之间存在巨大差异,请认真体会代码含义,理解编程思想对于计算机程序运行的优劣。从而理解算法对于程序的重要性。二、需求分析素数(质数):只能被1和它本身整除的自然......
  • [SNCPC2024] 2024 年陕西省大学生程序设计 J题猜质数II 题解
    题目链接:CF或者洛谷PS:CF的得等上gym。前提说明其实在上个月就见到这题了,当时很想做这题,结果找不到做题链接,也不知道出处,原来是陕西省赛的捧杯题。个人评价觉得是一道很不错的题,难度适中。讲解其实题解写的挺不错的,比很多比赛的题解写的详细许多了。这里站在我的角度分......
  • AI算法/模型/框架/模型库...都是什含义区别和联系?
    AI算法、模型、框架、模型库…都是什含义/区别和联系?算法、模型、模型库、框架什么是算法(Algorithm)?算法(Algorithm):算法是解决某一特定问题的步骤或规则集合。在AI/ML领域中,算法是用于训练模型、优化参数和执行推理的数学规则和计算方法。算法是模型训练的核心,通过......
  • 解决nacos报错 Caused by: io.grpc.netty.shaded.io.netty.channel.unix.Errors$Nati
    报错信息:org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)atorg.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)atorg......