算法笔记练习 5.5 质因子分解 问题 D: 约数的个数
题目
题目描述
输入n个整数,依次输出每个数的约数的个数。
输入
输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。
输出
可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。
样例输入
6
1 4 6 8 10 12
0
样例输出
1
3
4
4
4
6
思路
函数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();
Factor factors[10];
int N, num, i;
while (scanf("%d", &N) != EOF) {
if (N == 0)
continue;
while (N--) {
scanf("%d", &num);
int factorCnt = primeFactorization(num, factors);
int product = 1;
for (i = 0; i < factorCnt; ++i)
product *= factors[i].exp + 1;
printf("%d\n", product);
}
}
return 0;
}