质因子分解
- 1 本身不是素数, 因此它没有质因子, 如果题目要求对 1 处理, 要特判;
- 定义结构体存放质因子及其个数;
-
struct factor { int x, count; // x为质因子, cnt为其个数 }fac[10]; //2*3*5*7*11*13*17*19*23*29就会超过int范围, 因此在int型范围内的数, fac数组大小开到10就可以
对于一个正整数n来说, 如果它存在1和本身之外的因子,那么一定是在sqrt(n)的左右成对出现;
- 对于一个整数n来说, 如果它存在[2,n]范围内的质因子, 要么这些质因子全部小于等于sqrt(n),要么只存在一个大于sqrt(n)的质因子, 其余质因子全部小于等于sqrt(n);
- 枚举1 ~ sqrt(n)范围内的所有质因子p, 判断p是否是n的因子
if (n % prime[i] == 0) { fac[num].x = prime[i]; fac[num].count = 0; while (n % prime[i] == 0) { fac[num].count++; n /= prime[i]; } num++; //不同质因子个数加1 }
2. 如果在上面步骤结束后n仍热大于1, 说明n有且仅有一个大于sqrt(n)的质因子(有可能是n本身),这时需要将其加入fac数组,并令其个数为1;
if (n != 1) { fac[num].x = n; fac[num++].count = 1; }
(来源:晴神的《算法笔记》)