第十一届蓝桥杯(决赛)之阶乘约数
题目
问题描述
定义阶乘 n! = 1 × 2 × 3 × ··· × n。
请问 100! (100 的阶乘)有多少个约数。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
解析:
一、前置知识
- 任何一个正整数 X 都可以表示成若干个质数乘积的形式,即 X = p 1 a 1 × p 2 a 2 × . . . × p n a n X = p_1^{a1}\times p_2^{a2}\times...\times p_n^{an} X=p1a1×p2a2×...×pnan
- 那么约数个数= ( a 1 + 1 ) × ( a 2 + 1 ) × . . . × ( a n + 1 ) (a_1+1)\times(a_2+1)\times...\times(a_n+1) (a1+1)×(a2+1)×...×(an+1)
二、代码
取出每个因子的质数,伪代码如下:
while(...){
for(...){
number%i==0;//
}
}
因为每个正整数是由若干个质数乘积,所以不用判断被除数 i 是不是质数。这是因为如果i不是质数,那么它一定是由比它小的质数的乘积组成的,而在循环到 i 之前就已经除尽了那些质数,所以当前number肯定不是i的整倍,也就不用判断。
完整代码:
public class ExaminationC {
public static void sumOfFactor(int[] p,int n){
for (int i = 2; i <= 100; i++) {
int m = i;
for (int j = 2; m!=1; j++) {
while (m % j == 0) {
p[j]++;
m/=j;
}
}
}
}
public static void main(String[] args) {
int n = 100;
int[] p = new int[n];
long result = 1l;
sumOfFactor(p,n);
for (int i = 0; i <100 ; i++) {
result*=(p[i]+1);
}
System.out.println(result);
}
}