朝题夕解之数论

简介: 朝题夕解之数论

分解质因数


算术基本定理: 对于任何一个大于1的正整数都能唯一分解为有限个质数的乘积,可写作:

N = P1c1 P2c2 …Pmcm

其中ci都是正整数,Pi都是质数,且满足P1 < P2 < … < Pm


例题描述微信图片_20221018130107.jpg

参考代码(C++版本)

#include <iostream>
#include <algorithm>
using namespace std;
void divide(int n)
{
    //试除法枚举所有的数
    for(int i = 2;i <= n / i;i++)
        if(n % i == 0)
        {
            int s = 0;
            while(n % i == 0)
            {
                n /= i;
                s++;
            }
            printf("%d %d\n",i,s); //要清楚i才是底数
        }
    if(n > 1) printf("%d %d\n",n,1);
    puts("");
}
int main()
{
    //输入
    int n;
    scanf("%d",&n);
    while(n--)
    {
        //调函数
        int x;
        scanf("%d",&x);
        divide(x);
    }
    return 0;
}

算法模板


一、算法实现流程图:微信图片_20221018130203.jpg

二、算法的代码实现:

试除法分解质因数
void divide(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;
        }
    if (x > 1) cout << x << ' ' << 1 << endl;
    cout << endl;
}

疑难点剖析

一、明白题目需求

微信图片_20221018130256.png题目要的是将传入的数据分解为底数是/质数,指数是整数,分解结果的乘积等于原数据,输出的时候,要从小到大排列。


例如:

6就是21 x 31,因此就输出 2 1和3 1

48就是24 x 31,因此就输出2 4 和 3 1


二、指数的获取

8 = 23 = 2 x 2 x 2;


那么在代码层面,我们可以采用逆向思维,倒着对8进行运算,统计它进行的除法次数,也就是相乘的次数了。同时,也就是指数了。


质数筛选



例题描述

微信图片_20221018130432.jpg

参考代码(C++版本)

// 埃氏筛选法
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
int primes[N],cnt;
bool st[N];
void get_primes(int n)
{
    for(int i = 2;i <= n;i++)
    {
        if(!st[i])
        {
            primes[cnt++] = n;
            //利用现有的质数,将质数的倍数去掉
            for(int j = i+i; j <= n;j += i) st[j] = true;
        }
    }
}
int main()
{
    //输入
    int n;
    cin >>n;
    //调用函数
    get_primes(n);
    //输出
    cout << cnt <<endl;
    return 0;
}
//线性筛选法  算法原理:n只会被最小质因子筛掉
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
int primes[N],cnt;
bool st[N];
void get_primes(int n)
{
    for(int i = 2;i <= n;i++)
    {
        //如果是质数,就把加到数组中去
        if(!st[i]) primes[cnt ++]  = i;
        //从小到大枚举所有的质数
        for(int j = 0; primes[j] <= n/i;j++)
        {
            //把prims[j] * i筛掉
            st[primes[j] * i] = true;
            if(i % primes[j] == 0) break; //primes[j]一定是i的最小质因子
        }
        /*
        1、i % pj == 0 
            pj一定是i的最小质因子,pj一定是pj*i的最小质因子
        2、i % pj != 0
            pj一定小于i的所有质因子,pj也一定是pj * i的最小质因子
        */
    }
}
int main()
{
    //输入
    int n;
    cin >>n;
    //调用函数
    get_primes(n);
    //输出
    cout << cnt <<endl;
    return 0;
}

算法模板


一、埃氏筛法——用当前已有的质数去消去它们的倍数


首先,将2到n范围的所有整数获取到。其中,最小的数字2是质数,将2的所有倍数划去。表中剩余的数字中,最小的是3,它不能被更小的整除,所有它是质数,再将所有3的倍数划去。以此类推如果表中剩余的最小数字是m时,m就是质数。然后将表中所有m的倍数都划去。像这种反复操作,就能够依次枚举n以内的质数。

举个栗子:

微信图片_20221018130534.png

1.1、 算法实现流程如下:

微信图片_20221018130602.jpg

1.2、算法代码实现:

埃氏筛法求素数
int primes[N], cnt;   // primes[]存储所有素数
bool st[N];     // st[x]存储x是否被筛掉
void get_primes(int n)
{
    for (int i = 2; i <= n; i ++ )
    {
        if (st[i]) continue;
        primes[cnt ++ ] = i;
        for (int j = i; j <= n; j += i)
            st[j] = true;
    }
}

1.3、算法的时间复杂度 = O(NloglogN)


二、线性筛法

线性筛选的核心是—— 传入的整数n只会被最小质因子筛掉

2.1、算法实现流程:

image.jpeg

2.2、算法代码实现:

线性筛法求素数
int primes[N], cnt;   // primes[]存储所有素数
bool st[N];     // st[x]存储x是否被筛掉
void get_primes(int n)
{
    for (int i = 2; i <= n; i ++ )
    {
        if (!st[i]) primes[cnt ++ ] = i;
        for (int j = 0; primes[j] <= n / i; j ++ )
        {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0) break;
        }
    }
}

2.3、算法时间复杂度 = O(N)


疑难点剖析


清楚primes数组和st数组是分别用来维护素数集合和被筛除数据的集合

相关文章
可控细节的长文档摘要,探索开源LLM工具与实践
本文通过将文档分为几部分来解决这个问题,然后分段生成摘要。在对大语言模型进行多次查询后,可以重建完整的摘要。通过控制文本块的数量及其大小,我们最终可以控制输出中的细节级别。
|
JSON API 数据格式
店铺所有商品列表接口json数据格式示例(API接口)
当然,以下是一个示例的JSON数据格式,用于表示一个店铺所有商品列表的API接口响应
|
开发框架 前端开发 JavaScript
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码
|
Oracle IDE Java
Java零基础教学(04):如何Java环境配置??
【8月更文挑战第4天】Java零基础教学篇,手把手实践教学!
262 1
|
边缘计算 运维 Kubernetes
与客户同行,ACK Edge携手专属钉获 “信通院边缘计算十佳案例”
基于ACK Edge的《专属钉混合云架构云边协同》被评为边缘计算十佳“星耀”案例,本文介绍ACK Edge典型场景以及在专属钉场景的落地案例。
|
缓存 监控 网络协议
一文带你了解10大DNS攻击类型,收藏!
【10月更文挑战第23天】
2745 1
一文带你了解10大DNS攻击类型,收藏!
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能如何赋能教育发展?探索未来教育的新篇章
本文探讨人工智能(AI)对教育领域的深远影响,涵盖教学方式变革、教育资源均衡、教师角色重塑及学生能力培养等方面。生成式AI技术助力个性化教学,减轻教师负担,促进城乡教育公平。同时,AI教育强调伦理与法律知识,提升学生综合素养和职场竞争力。GAI认证等培训框架为学习者提供实用技能,助力其在数字时代脱颖而出。人工智能正推动教育迈向优质均衡发展,为未来人才培养铺就希望之路。
|
设计模式 编解码 前端开发
WPF技术之UI框架介绍
WPF(Windows Presentation Foundation)是微软公司开发的一种用于创建Windows应用程序的UI框架。它是.NET框架的一部分,是Windows Vista及更高版本操作系统的默认UI框架。
2777 0
WPF技术之UI框架介绍
|
传感器
红外雨量计(光学雨量传感器)雨型监测原理
红外雨量计由红外发射器和接收器组成。红外发射器向上发射红外线,当雨滴落在发射器和接收器之间时,部分红外线被雨滴反射,另一部分则透过雨滴到达接收器。
红外雨量计(光学雨量传感器)雨型监测原理
|
存储 小程序 数据库
小程序导出数据到excel表,借助云开发云函数实现excel数据的保存
小程序导出数据到excel表,借助云开发云函数实现excel数据的保存
441 0