以下思路参考《算法笔记》
质因子分解:把一个正整数n写成一个或多个质数相乘的形式
例如 6=2✖️3 ,180=2✖️2✖️3✖️3✖️5
先说如何判断一个数n,是否在[2,n) 中存在它的因子:
假
设
这
个
n
存
在
因
子
为
k
[
2
,
n
)
,
那
么
n
m
o
d
k
=
0
假设这个n存在因子为 k [2,n) ,那么n\mod k=0
假设这个n存在因子为k[2,n),那么nmodk=0
由
于
n
×
n
k
=
n
,
所
以
n
m
o
d
n
k
=
0
,
所
以
k
与
n
k
都
是
n
的
因
子
,
且
m
i
n
(
k
,
n
k
)
<
=
n
由于 n\times\frac{n}{k}=n,所以n\mod\frac{n}{k}=0,所以 k 与 \frac{n}{k} 都是 n的因子,且min(k,\frac{n}{k}) <= \sqrt{n}
由于n×kn=n,所以nmodkn=0,所以k与kn都是n的因子,且min(k,kn)<=n
只
要
判
定
0
,
1
,
2
,
3
,
.
.
.
,
n
都
不
是
n
的
因
子
,
那
么
n
就
是
质
数
只要判定 0,1,2,3 ,... ,\sqrt{n} 都不是n的因子,那么n就是质数
只要判定0,1,2,3,...,n都不是n的因子,那么n就是质数
我 们 质 因 子 分 解 也 可 以 用 这 思 路 : 对 一 个 正 整 数 n 来 说 , 若 它 存 在 [ 2 , n ] 的 质 因 子 我们质因子分解也可以用这思路:对一个正整数n来说,若它存在[2,n]的质因子 我们质因子分解也可以用这思路:对一个正整数n来说,若它存在[2,n]的质因子 要 么 这 些 质 因 子 全 部 小 于 等 于 n , 要 么 质 存 在 一 个 大 于 n , 其 余 质 因 子 全 部 小 于 等 于 n 要么这些质因子全部小于等于\sqrt{n},要么质存在一个大于\sqrt{n},其余质因子全部小于等于\sqrt{n} 要么这些质因子全部小于等于n,要么质存在一个大于n,其余质因子全部小于等于n
这 就 给 进 行 质 因 子 分 解 一 个 很 好 的 思 路 : 这就给进行质因子分解一个很好的思路: 这就给进行质因子分解一个很好的思路:
枚 举 1 ~ n 所 有 质 因 子 p , 判 断 p 是 否 是 n 的 因 子 枚举1~\sqrt{n}所有质因子p,判断p是否是n的因子 枚举1~n所有质因子p,判断p是否是n的因子
- 如果是质因子,则保存
- 如果不是质因子,则跳过
如
果
上
面
步
骤
结
束
后
,
n
仍
然
大
于
1
,
说
明
n
是
质
数
,
也
把
它
保
存
夜
来
如果上面步骤结束后,n仍然大于1,说明n是质数,也把它保存夜来
如果上面步骤结束后,n仍然大于1,说明n是质数,也把它保存夜来
先用if判断是不是质因子,再用while计算这个质因子的数量
//存放质因子的结构体
struct factor{
int x;//质因子
int cnt;//个数
}fac[10];
fac_cnt=0;
sq = sqrt(n);
for (int i = 0; prime[i]<=sq;i++) { //
if (n%prime[i] == 0) { //prime是一个质数表
fac[fac_cnt].x = prime[i];
fac[fac_cnt].cnt = 0;
while (n%prime[i] == 0) { //计算n中包含质数prime[i]的个数
fac[fac_cnt].cnt++;
n /= prime[i];
}// end while
fac_cnt++;
}
}
if (n != 1) {
fac[fac_cnt].x = n;
fac[fac_cnt++].cnt = 1;
}
这样的话,遍历fac就能获取n质因子分解后的结果