题目描述:
2题 阶乘约数
问题描述
定义阶乘 n! = 1 × 2 × 3 × ··· × n。
请问 100! (100 的阶乘)有多少个约数。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无
法得分
题目解析:
由于100的阶乘这个数特别大,我们不能用普通的方法来写,这是我们就要用到约数的简便运算。
简便运算:
首先把这个数先用2、3、5、7、11、13、…等质数的连乘积表示。
比如24 = 2223 = 2³ * 3再用各个质数的指数加一后再相乘即为此数的约数个数,比如 (3+1)(1+1)=4*2=8, 即表示24有8个约数。
例如:
1200000 = 2^7 * 3 * 5^5;
所以约数个数有(7+1) * (1+1) * (5+1) = 8 * 2 * 6 =96
知道上面的简便方法后,这题就有了一个思路。我们可以算出100之内的每一个数关于其质数的约数,就像质数2出现了多少次,3出现了多少次,将他们的质数加一相乘,就可以得到100的阶乘的约数。
解题代码:
public class 阶乘约数 {
public static void main(String[] args) {
int[] p=new int[101];
for (int i = 2; i <= 100; i ++)
{
int n = i;
for (int j = 2; j <= n / j; j ++) {//这里j<=n也可以,代码在下面,就少了一个if语句
while (n % j == 0) {
p[j]++;
n /= j;
}
}
if(n > 1) p[n] ++;
}
long ans=1;
for (int i = 2; i <= 100; i++)
{
if (p[i]!=0)
{
ans *= p[i] + 1;//这一步就是说的那个约数算法公式
}
}
System.out.println(ans);
}
}
代码解析2:
public class 阶乘约数 {
public static void main(String[] args) {
int[] p=new int[101];
for (int i = 2; i <= 100; i ++)
{
int n = i;
for (int j = 2; j <= n ; j ++) {//这里j<=n也可以
while (n % j == 0) {
p[j]++;
n /= j;
}
}
}
long ans=1;
for (int i = 2; i <= 100; i++)
{
if (p[i]!=0)
{
ans *= p[i] + 1;
}
}
System.out.println(ans);
}
}
题目答案:
题后反思:
我刚开始的思路并不是这样,原本我是想将100的阶乘给算出来,但是写的时候发现这种方法并不可行,100的阶乘实在是太大了,而且即使算出来,算约数的时候所需的时间也会更长。