【算法基础】分解质因数

简介: 【算法基础】分解质因数

什么是分解质因数

分解质因数是指将一个合数用质因数相乘的形式表示出来,即将一个合数分解为若干个质数的乘积。其中每个质数都是这个合数的因数。例如,将30分解质因数,得到2×3×5,即将30表示为2、3、5三个质数的乘积。分解质因数只针对合数,对于质数和1,不需要进行分解质因数。


具体案例

给定 n nn 个正整数 a i a_iai,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。

输入格式

第一行包含整数 n nn

接下来 n nn 行,每行包含一个正整数 a i a_iai

输出格式

对于每个正整数 a i a_iai,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。

每个正整数的质因数全部输出完毕后,输出一个空行。

数据范围

1 ≤ n ≤ 100 1≤n≤1001n100,

2 ≤ a i ≤ 2 × 1 0 9 2≤a_i≤2×10^92ai2×109

输入样例

2
6
8

输出样例

2 1
3 1
2 3

原理讲解

原始方法

原始的分解质因数的方法,是从小到大遍历所有小于n的数i,如果n % i == 0 且i为素数,那么i就是其中的一个质因数。

按照这样的思路,我们只需要判断一次取余运算,判断一次素数。但是对于这道题的数据范围,一定会TLE。

转换思路

由于这道题还需要求出每个质因数的指数,那每次找到这个质因数之后,让n不停的除这个数i,直到除完为止,每除一次就表示次数+1

这样就不需要把n遍历完,每找到一个素数k,n会减小1~k^s倍

但是每次除法的过程也会有s次操作,数据范围仍然不允许

利用试除法判定质数的思路

可以把试除的时间复杂度降到O(sqrt(n))

只需要判断sqrt(n)以内的质因数,但是sqrt(n)~n之间可能存在质因数且最多一个,所以在遍历完之后需要判断n是否被除尽,如果还有剩,那剩下的这个一定是一个质因数。

为什么不需要单独判断是否为质数

这其实用到了埃氏筛法筛素数的一个原理:

我们每判断完一个素数x,就在2 - i-1之间把x的倍数筛了一遍了,于是在2 - i-1之间就不存在x的倍数了

反证法证一下

假设我们遍历到一个数i是一个合数,那么它可以分解质因数,那么在2 - i-1之间就一定可以找到一个质数是i的因数,而根据我们的算法,前面所有遇到的质数已经把该质数的倍数除干净了,所以不存在任何一个质数的倍数,所以它在前面找不到一个质因数,所以它一定不是合数,与假设相矛盾,所以它一定是质数。

#include<iostream>
using namespace std;
void divide(long long n){
    // int x = sqrt(n);
    int i;
    for(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; 
    cout << endl;
}
int main(){
    int n;
    cin >> n;
    while(n--){
        long long a;
        cin >> a;
        divide(a);
    }
    return 0;
}

作者:为梦而生

链接:https://www.acwing.com/activity/content/code/content/7348563/

来源:AcWing

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章
|
算法
【算法刷题】—7.9动态规划,游戏跳跃,分解质因数
✨今日算法三题 1.使用最小花费爬楼梯 2.跳跃游戏 3.只有两个键的键盘
【算法刷题】—7.9动态规划,游戏跳跃,分解质因数
|
算法
C算法分解质因数与分解因子
//打印因子 int Print_yinzi(int num) { int i ; for(i = 1 ; i
902 0
|
算法 测试技术
数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test
Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 29046   Accepted: 7342 Case Time Limit: 4000MS Descri...
1005 0
|
算法 机器学习/深度学习 C++
|
算法 搜索推荐 Java
冒泡排序算法 递归算法,求n的阶乘 求最大公约数和最小公倍数 java分解质因数
<p> </p> <p>   1.  /** </p> <p>   2.  * 冒泡排序算法 </p> <p>   3.  */  </p> <p>   4. public class BubbleSort {  </p> <p>   5.     public static void sort(int[] values) {  </p> <p>   6.         int
2355 0
|
4天前
|
算法 安全 数据库
基于结点电压法的配电网状态估计算法matlab仿真
**摘要** 该程序实现了基于结点电压法的配电网状态估计算法,旨在提升数据的准确性和可靠性。在MATLAB2022a中运行,显示了状态估计过程中的电压和相位估计值,以及误差随迭代变化的图表。算法通过迭代计算雅可比矩阵,结合基尔霍夫定律解决线性方程组,估算网络节点电压。状态估计过程中应用了高斯-牛顿或莱文贝格-马夸尔特法,处理量测数据并考虑约束条件,以提高估计精度。程序结果以图形形式展示电压幅值和角度估计的比较,以及估计误差的演变,体现了算法在处理配电网状态估计问题的有效性。
|
1天前
|
数据采集 存储 算法
基于BP算法的SAR成像matlab仿真
**摘要:** 基于BP算法的SAR成像研究,利用MATLAB2022a进行仿真。SAR系统借助相对运动合成大孔径,提供高分辨率图像。BP算法执行回波数据预处理、像素投影及图像重建,实现精确成像。优点是高精度和强适应性,缺点是计算量大、内存需求高。代码示例展示了回波生成、数据处理到插值显示的全过程。
|
8天前
|
机器学习/深度学习 自然语言处理 算法
m基于深度学习的OFDM+QPSK链路信道估计和均衡算法误码率matlab仿真,对比LS,MMSE及LMMSE传统算法
**摘要:** 升级版MATLAB仿真对比了深度学习与LS、MMSE、LMMSE的OFDM信道估计算法,新增自动样本生成、复杂度分析及抗频偏性能评估。深度学习在无线通信中,尤其在OFDM的信道估计问题上展现潜力,解决了传统方法的局限。程序涉及信道估计器设计,深度学习模型通过学习导频信息估计信道响应,适应频域变化。核心代码展示了信号处理流程,包括编码、调制、信道模拟、降噪、信道估计和解调。
30 8
|
10天前
|
算法
基于GA遗传优化的混合发电系统优化配置算法matlab仿真
**摘要:** 该研究利用遗传算法(GA)对混合发电系统进行优化配置,旨在最小化风能、太阳能及电池储能的成本并提升系统性能。MATLAB 2022a用于实现这一算法。仿真结果展示了一系列图表,包括总成本随代数变化、最佳适应度随代数变化,以及不同数据的分布情况,如负荷、风速、太阳辐射、弃电、缺电和电池状态等。此外,代码示例展示了如何运用GA求解,并绘制了发电单元的功率输出和年变化。该系统原理基于GA的自然选择和遗传原理,通过染色体编码、初始种群生成、适应度函数、选择、交叉和变异操作来寻找最优容量配置,以平衡成本、效率和可靠性。
|
2天前
|
算法 vr&ar
基于自适应波束成形算法的matlab性能仿真,对比SG和RLS两种方法
```markdown - MATLAB2022a中比较SG与RLS自适应波束成形算法。核心程序实现阵列信号处理,强化期望信号,抑制干扰。RLS以其高效计算权重,而SG则以简单和低计算复杂度著称。[12345] [6666666666] [777777] ```