质因子的分解

1:所谓的质因子分解是指将一个正整数n写成一个或多个质数的乘积的形式,例如:6=2*3,8=2*2*2.或者将其写为指数形式,如:6=2^1*3^1,180=

2^2  * 3^2 * 5^1;由于最后要归结到若干不同指数的乘积,因此需要先将素数表打印出来。

注意:1本身不是素数,因此他没有质因子,一般就是讨论大于1 的数。如果有的题目需要对1进行讨论,那么就要视为特判。

由于每个质因子都可以不只出现一次,因此不妨定义结构体factor,用来存放质因子及其个数。

struct factor{
int x,cnt;//x为质因子,cnt为质因子的个数 
}fac[10];
这里的质因子存放到fac[]数组里。如:180来说;
fac[0].x = 2;
fac[0].cnt  = 2;
fac[1].x = 3;
fac[1].cnt = 2;
fac[2].x = 5;
fac[2].cnt = 1; 

fac[10]开到10的原因是:2*3*5*7*11*13*17*19*23*29就已经超出了int范围所以就只用到开到10;

对一个正整数n来说,如果他存在1和本身之外的因子,那么一定是在sqrt(n)左右成对出现。而这里也可以用在“质因子”上面,会得到一个强化结论:对一个正整数n来说,如果它存在【2,n】范围的质因子,要么这些质因子全部小于等于sqrt(n),要么这些质因子只存在一个大于sqrt(n)的质因子,而其余质因子全部小于等于sqrt(n)。这就有了一个思路:

1:枚举1~sqrt(n)范围内的所有质因子p,判断p是否是n的因子。

如果p是n的因子,那么给fac数组中增加质因子p,并初始化为0.然后只要p还是n的因子,就让n不断的除以p,每次操作使p的个数加1,直到p不是n的因子为止。

if(n % prime[i] == 0){
fac[num].x = prime[i];
fac[num].cnt = 0;
while(n % prime[i] == 0){
fac[num].cnt ++;
n /= prime[i];
}
num++;
}

如果p不是n的因子,就直接跳过。


2:如果上面的步骤结束后n仍然大于1,说明有且仅有一个大于sqrt(n)的质因子(有可能是n本身),这时需要把这个质因子加入fac数组中,并令其个数等于1.

if(n!=1){//如果无法被根号n以内的质因子除尽 
fac[num].x = n;
fac[num++].cnt = 1; 
}

至此,fac数组中存放的就是质因子分解的结果,时间复杂度就是O(sqrt(n))。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值