质因子分解的问题就是给定一个n使得n可以分解为多个因子的乘积形式,而且相同因子用指数形式表示;
例如180=2^23^25;数组
对于这个问题,很好理解,咱们的目的就是寻找其因子,一般的方法也就是从0开始枚举,而后经过取模或者整除操做来看是不是咱们须要的元素;code
具体的思路以下所示:
咱们首先创建一个结构体:方法
struct factor{ int x; int cnt; }fac[10];
这里为每个符合条件的因子创立一个结构体,fac数组是当前该数字全部因子存储数组;
结构体内x表明当前的因子,cnt表明当前因子出现的个数;
这里开10的目的是若是开更大会致使int溢出,并无什么必要;im
接下来就是计算部分;
咱们对1~sqrt(n)挨个进行枚举;这里借鉴了寻找断定素数的概念,由于若是k存在,为n的质因子,对于n/k*n来讲,其也是n的质因子,咱们的目的是寻找最小质因子,因此只须要枚举到sqrt(n)就能够;while
接下来要注意理解一个质因子分布的问题;
对于咱们枚举到sqrt(n),必然会出现两种状况:
1.全部质因子都在sqrt(n)的枚举范围内;
2.有一个质因子大于sqrt(n),但其他的说有质因子都在sqrt(n)范围内,而且该较大的质因子必为素数;co
咱们该怎么理解这个问题,第一条很好理解,显然成立,那么第二条必然成立吗?
会不会有两个数字斗大于sqrt(n),而且这两个既多是合数有多是素数?数字
首先,不可能有两个质因子大于sqr(n),这样会致使乘积大于n,因此不符合初始条件;
那么剩下的质因子必定为素数嘛?
若是这个质因子是合数,则说明能够分解,一定能够分为多个较小质因子的乘积,或者多个数和一个素数的乘积;
因此不管那种状况,都是两种状况中的一个;结构体
因此接下来咱们经过枚举,对一个质因子猛除,记录他的出现次数,若是有余数,进行下一个数字的枚举猛除;直到到达sqrt(n)边界,若是仍是有余数,则说明有第二个条件发生,有个较大的质因子,因此直接记录,由于这个质因子只可能出现一次,若是屡次会使得乘积大于n;枚举
大体的判断逻辑以下所示:struct
for(int i=0;i<sqrt(n);i++){ 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++; } } if(n!=1){ fac[num].x=n; fac[num++].cnt=1; }