质因数
质因数:一个数的约数为质数,则这个约数称为质因数
首先我们了解一下算数基本定理
算数基本定理:(欧几里得最早提出 Respect)
任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1^a1xP2 ^a2xP3 ^a3…Pn ^an,这里P1<P2<P3…<Pn均为质数,其中指数ai是正整数。
举个例子
12=2^2x3(质因数为2、3)
360=2 ^3×3 ^2×5 ^1(质因数2、3、5)
不要把约数和质因数搞混哦!,12的约数有1、12、3、4、2、6但质因数只有2、3
如何利用算法求解质因数呢?
从算数基本定理可以看出任意一个数n,其中p1为最小的质因数,首先我们要找到p1,然后n每次除以等于p1,除到无法整除为止,在寻找出p2,在用n除以等于p2,依次类推,最终的n要么为1,要么不为1,当n不为1时,则剩余的n为最后一个质因数!
太抽象了, 我们来举一些例子,其实就是短除法!
n=12(n最后为1的情况)
i=2; n/=2 n=6 继续因为还没有除干净 n/=2 n=3无法整除 记录2为质因数 i++
i=3; n/=3 n=1 记录3为质因数 结束循环
n=14(n最后不为1的情况)
i=2;n/=2 n=7 i++ i=3,无法整除 i++, i=4 4>sqrt(14) 结束循环
n!=1; 所以最后一个质因数为n ,n=7
图解
实现代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4;
int prime_fac[maxn],cnt;
int n;
void solve(int n)
{
for(int i=2; i*i<=n; i++)//注意循环终止条件
{
if(n%i==0)
{
cnt++;
prime_fac[cnt]=i;
}
while(n%i==0) n/