算法笔记练习 5.5 质因子分解 问题 C: 质因数的个数
题目
题目描述
求正整数N(N>1)的质因数的个数。
相同的质因数需要重复计算。如120=22235,共有5个质因数。
输入
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出
对于每组数据,输出N的质因数的个数。
样例输入
120
200
样例输出
5
5
提示
注意1不是N的质因数;若N为质数,N是N的质因数。
思路
函数primeFactorization
的思路请参考【PAT A1059】Prime Factors 。
代码
#include <stdio.h>
#include <math.h>
#define MAX 50000
typedef struct {
int x, exp;
} Factor;
// 打素数表
int isPrime[MAX], primeCnt = 0, primeTable[MAX/10];
int findPrime(void) {
int i, j;
for (i = 2; i < MAX; ++i)
isPrime[i] = 1;
for (i = 2; i < MAX; ++i) {
if (isPrime[i]) {
primeTable[primeCnt++] = i;
for (j = i; j < MAX; j += i)
isPrime[j] = 0;
}
}
}
// 对 num 质因子分解,结果放入 factors,返回质因子数量
// 要求 num >= 2
int primeFactorization(int num, Factor *factors) {
int i, n = num; // n 是 num 的副本
int factorCnt = 0;
for (i = 0; i < 10; ++i) // 初始化
factors[i].exp = 0;
for (i = 0; i < primeCnt; ++i) {
if ((int)sqrt((double)num) < primeTable[i])
break;
if (n % primeTable[i] == 0) {
factors[factorCnt].x = primeTable[i];
while (n % primeTable[i] == 0) {
n /= primeTable[i];
++factors[factorCnt].exp;
}
++factorCnt;
}
}
if (n != 1) {
factors[factorCnt].x = n;
factors[factorCnt].exp = 1;
++factorCnt;
}
return factorCnt;
}
int main() {
findPrime();
int N, i;
Factor factors[10];
while (scanf("%d", &N) != EOF) {
int cnt = 0;
int factorCnt = primeFactorization(N, factors);
for (i = 0; i < factorCnt; ++i)
cnt += factors[i].exp;
printf("%d\n", cnt);
}
return 0;
}