问题描述
定义阶乘 n! = 1 × 2 × 3 × · · · × n。
请问 100! (100 的阶乘)有多少个正约数。
答案提交
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
解题思路
这道题是第十一届蓝桥杯JavaB组国赛第三题,是一道结果填空题,故不需要过度纠结算法效率。这道题用到了数论中的一个知识点:
一般地,一个自然数 N 可以唯一地表示成一些质因数的乘积: ,那么 N 的全部因数(约数)的个数就有:
个。
利用唯一分解定理,分解出质因数对应的幂数。
该算法的思路如下:首先定义一个数组 arr 用于记录 1 ~ 100 中每一位数所分解成的质因数幂,其中数组下标为质因数,数组值为幂。例如通过给出的算法可以求得 ,则 arr[2] = 2 , arr[3] = 1,以此类推可以得到从 1 ~ 100 的所有质因数所对应的幂并记录在数组的相应位置中。数学中的幂计算公式可以得知,两个同底的幂数相乘,底数不变,幂数相加,故从 1 ~ 100 的每一位数拆分结果可以共同存储在一个 arr 数组中,最后对该 arr 数组进行计算求解即可。该算法的 Java 代码实现如下:
public class Main{
public static void main(String[] args) {
//用于存储 100 的阶乘中每一位数所分解成的质因数所对应的幂
int[] arr = new int[102];
long result = 1;
int i, j, temp;
// 利用惟一分解定理分别分解 100 的阶乘所对应的每一位数
for (i = 2; i <= 100; i++) {
temp = i;
for (j = 2; j * j <= temp; j++) {
// 当能够整除的时候,对应余数的幂次加一
while (temp % j == 0) {
arr[j]++;
temp /= j;
}
}
//若剩下的 n 不等于 1 则表示这是一个因数,对应幂次 + 1
if (temp > 1) {
arr[temp]++;
}
}
for (i = 2; i <= 100; i++) {
result *= (arr[i] + 1);
}
System.out.println(result);
}
}