求阶乘的约数


说明:

用于求阶乘有多少个约数~

Java代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

import java.util.Scanner;

/**
* @description: 求阶乘约数
* 这个算法的模板的主要作用是用于求指定阶乘有多少个约数,其实这里是套用了能分解成多少个质数的模板。。。
* @author 长白崎
* @date 2023/5/26 16:39
* @version 1.0
*/
public class 阶乘约数 {

public static void main(String[] args) {
//一下为测试条例
Scanner sc = new Scanner(System.in);
//输入需要测试的的阶乘数字
int num = sc.nextInt();
System.out.println(slove(num));
}


//这个也是算法的一部分
public static long slove(int num){
//这里用我们将传过来的数字作为我们需要开的数组大小,其实这里的数组开的大小就是我们需要阶乘的对应的数字的
int data[] = new int[num+1];
//这一步的作用用于将1~num所有需要阶乘的数字的数字进行
for(int i = 1 ; i <=num ; ++i){
slove2(i,data);
}

long ans =1;
for(int i =1 ; i <=num ; ++i){
if(data[i]==0) //这里过滤掉相应乘数不能约的数(也就是能 约的数字的数量为0的数)
continue;
ans*=(data[i]+1); //这里一定要注意+1
}
return ans;
}
//这个是主要的求当前阶乘的数字能分解出多少个数字
public static void slove2(int num,int data[]){


//这里的循环用于求是否是质数的那个模板,详细可以看看判断是否是质数的模板
for(int i= 2 ; i <=Math.sqrt(num) ; ++i){

//这里是判断是否不为质数,如果不是质数那么就进行分解
if(num%i==0){
while(num%i==0){
num/=i;
++data[i]; //这一步的作用就是用于统计能分解成多少个数
}
}
}
//这里判断最后分解完之后最好分解剩下的是否还能凑成一个质数,如果能那么也能算作可约数字
if(num>1){
++data[num];
}
}

}