题目描述
定义阶乘 n! = 1 × 2 × 3 × ··· × n。
请问 100! (100 的阶乘)有多少个约数。
解法一
解题思路
所以只需求出n!的所有质因数个数即可求解
python代码
#阶乘约数
import math
def is_prime(num): #判断一个数是否为质数,是返回true
if num == 1:
return False
for i in range(2,int(math.sqrt(num))+1):
if num % i == 0:
return False
return True
'''任意一个正整数 X 都可以表示成若干个质数乘积的形式,即 X = p1^α1 ∗ p2^α2 …… ∗ pk^αk
约数个数 = (a1 + 1)(a2 + 1)……(ak + 1)'''
def solution(n):
d = {}#存储质因数的个数
for i in range(1,n+1):
tmp = i
j = 2
while j <= tmp:
if tmp % j == 0 and is_prime(j):
d[j] = d.get(j,0) + 1
tmp = tmp // j
else:
j += 1
ans = 1
for key in d:
ans = ans*(d[key]+1)
return ans
if __name__ == "__main__":
n = 100
ans = solution(n)
print(ans)
运行结果
java代码
/*
* 跑步训练,答案3880*/
import java.lang.Math;
/*
* 阶乘约数,答案39001250856960000*/
public class homework02 {
/*
* 判断一个数是否为素数,是返回true*/
private static boolean is_prime(int num) {
if (num == 1)
return false;
for (int i = 2; i < (int)(Math.sqrt(num) + 1); i++) {
if (num % i == 0)
return false;
}
return true;
}
/*
* 任意一个正整数 X 都可以表示成若干个质数乘积的形式,即 X = p1α1 ∗ p2α2 …… ∗ pkαk
约数个数 = (a1 + 1)(a2 + 1)……(ak + 1)*/
private static long solution(int n) {
int i,j,tmp;
long ans;
int[] a = new int[100]; //a[i]表示i+1的个数,初始全为0
for (i = 0; i < n; i++) {//初始化数组a
a[i] = 0;
}
for(i = 1; i <= n; i++) {
tmp = i;
j = 2;
while(j <= tmp) {
if(tmp % j == 0 && is_prime(j)) {
a[j-1]++;
tmp = tmp / j;
}
else
j++;
}
}
ans = 1L;
for (i = 0; i < n; i++) {
if (a[i] != 0) {
ans *= (a[i]+1);
}
}
return ans;
}
public static void main(String[] args) {
long ans;
int n;
n = 100;
ans = solution(n);
System.out.println(ans);
}
}
运行结果