HELLO WORLD--一起加油(🍺)!|

kingwzun

园龄:3年6个月粉丝:111关注:0

📂数学
🔖质数
2022-07-21 20:49阅读: 2028评论: 0推荐: 0

分解质因数 | 求解最大质因数

前言

求解最大质因数分解质因数时只返回最大质因数
本文只讲了短除法分解质因数,算法时间复杂度为 n

还有一个算法时间复杂度为On14的算法,看这里吧Pollard Rho快速因数分解

基础知识:

  1. 任何一个正整数都必然可以表示为许多个质数的乘积。
    根据算术基本定理,任何正整数皆有独一无二的质因子分解式

  2. 素数x素数=合数,素数x合数=合数,合数x合数=合数

  3. 如果一个合数n有比n 大的质因数,那么这样的质数有且只有一个。
    如果有两个,那么这两个质数相乘就大于n了。

质因数:

每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数。
只有一个质因子的正整数为质数。

比如12=2×2×3,2和3就是12的质因数。

短除法分解质因数

方法:
从最小的质数除起,一直除到结果为质数为止。

例如:
image

时间复杂度: n

需要注意的是:

  1. 因为一个合数的质因子一定在扫描到这个合数之前就从N中剔除掉了,所以无需验证 i 是否为质数
  2. 如果N没有被任何2~sqrtN的数整除,则N是质数。

求解最大质因数代码:

int getmaxprime(int n)
{
for (int i = 2; i <= sqrt(1.0 * n); i++)//从2到根号n求其质因数
{
while (n % i == 0)
n = n / i;
//此时输出i就是分解所有质因子
}
return n;
}

还可以更快一点

void getmaxprime(int n)
{
for (int i = 2; i <= 1.0 * sqrt(n);)
{
int cnt = 0;
while (n % i == 0)
n = n / i;
// 不需要每次只+1
if (i == 2) i++;
else i += 2;
}
return n;
}

短除法还可以用来求多个数的最大公因数和最小公倍数:

求几个数最大公因数的方法:先把每个数的因数找出来,然后再找出公因数,最后在公因数中找出最大公因数。

例如:求12与18的最大公因数。
给每个数分别分解质因数的方法。
12=2×2×3
18=2×3×3
所分出的质因数无疑都能整除原数,因此这些质因数也都是原数的约数。
从分解的结果看,12与18都有公约数2和3,而它们的乘积2×3=6,就是 12与18的最大公约数。

如果把这两个数合在一起短除,则更容易找出公约数和最大公约数。
例如:
image

短除法竖式左边就是这两个数的公共质因数,而两个数的最大公约数就是这两个数的公共质因数的连乘积。最小公倍数就是把所有约数和最终剩下无法约分的数连乘。

原文1(不太建议看原文,很多写错了)

本文作者:kingwzun

本文链接:https://www.cnblogs.com/kingwz/p/16503560.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   kingwzun  阅读(2028)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起