质因子分解

21 篇文章 0 订阅
20 篇文章 1 订阅

以下思路参考《算法笔记》
质因子分解:把一个正整数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 nk[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=nnmodkn=0kknnmin(k,kn)<=n
只 要 判 定 0 , 1 , 2 , 3 , . . . , n 都 不 是 n 的 因 子 , 那 么 n 就 是 质 数 只要判定 0,1,2,3 ,... ,\sqrt{n} 都不是n的因子,那么n就是质数 0123,...,n nn

我 们 质 因 子 分 解 也 可 以 用 这 思 路 : 对 一 个 正 整 数 n 来 说 , 若 它 存 在 [ 2 , n ] 的 质 因 子 我们质因子分解也可以用这思路:对一个正整数n来说,若它存在[2,n]的质因子 n[2n] 要 么 这 些 质 因 子 全 部 小 于 等 于 n , 要 么 质 存 在 一 个 大 于 n , 其 余 质 因 子 全 部 小 于 等 于 n 要么这些质因子全部小于等于\sqrt{n},要么质存在一个大于\sqrt{n},其余质因子全部小于等于\sqrt{n} n n n

这 就 给 进 行 质 因 子 分 解 一 个 很 好 的 思 路 : 这就给进行质因子分解一个很好的思路:

枚 举 1 ~ n 所 有 质 因 子 p , 判 断 p 是 否 是 n 的 因 子 枚举1~\sqrt{n}所有质因子p,判断p是否是n的因子 1n ppn

  • 如果是质因子,则保存
  • 如果不是质因子,则跳过

如 果 上 面 步 骤 结 束 后 , n 仍 然 大 于 1 , 说 明 n 是 质 数 , 也 把 它 保 存 夜 来 如果上面步骤结束后,n仍然大于1,说明n是质数,也把它保存夜来 n1n
先用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质因子分解后的结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值