本题计算100的阶乘有多少公约数,可以先计算出100的阶乘,然后使用计算公约数的方法计算公约数。那么我们来分析一下如何计算公约数,举个例子6的公约数有1*6;2*3;共有四个公约数。因为数学的学习我们知道一个数的公约数肯定小于或者等于这个数的一半,必定有另一个大于这个数的一半与之凑成一组公约数。所以可以稍微优化一下,判断一半的数字多++就行。
做法👇
①计算出100的阶乘
②编写计算约数个数的方法(函数)注意:必须测试自己的代码是否可用具有普遍性,找出不合理的地方进行修改完善
③计算100阶乘的约数并且输出
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int x=scanner.nextInt();
BigInteger b=new BigInteger("1");
while (x>1) {
BigInteger a=new BigInteger(String.valueOf(x));
b = b.multiply(a);
x--;
}
System.out.println(b);
scanner.close();
}
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int x=scanner.nextInt();
int count=0;
for (int i = 1; i <= Math.sqrt(x); i++) {//只计算到开方的取小
if (x%i==0 && i*i!=x) {
count+=2;
}
if (i*i==x) {//未考虑的地方
count++;
}
}
System.out.println(count);
scanner.close();
}
暴力解法数据量非常之恐怖,继续改进- -
接下来我们则使用质因数分解的方法:在探讨数的约数个数时,我们可以通过分解质因数来更深入地理解。例如,假设一个数可以表示为A×B×C的形式,那么这个数的约数个数可以通过计算A、B、C各自质因数分解后的指数加一再相乘得到。具体来说,如果A、B、C分别可以分解为质因数的乘积形式,如A=p1^a1,B=p2^a2,C=p3^a3,那么这个数约数个数为(a1+1)×(a2+1)×(a3+1)。
这种计算方法不仅适用于简单的乘积形式,还能扩展到更复杂的数。对于一个较为复杂的数,比如D=p1^a1×p2^a2×p3^a3×...×pn^an,其约数个数就为(a1+1)×(a2+1)×...×(an+1)。这里p1,p2,...,pn代表不同的质数,而a1,a2,...,an则是这些质数在该数分解质因数时的指数。
①循环1~100,求出各个值的质因子个数存储在数组中
②循环数组,将每一个质因子个数+1再相乘得到结果
注意数字的范围
代码如下👇
public static void main(String[] args) {
int[] num=new int[101];//分解质因子个数
long count=1;//结果
for (int i = 1; i <= 100; i++) {//1到100的阶乘
int m=i;
for (int j = 2; j*j <= m; j++) {
while (m%j==0) {
num[j]++;
m/=j;
}
}
if (m>1) {
num[m]++;
}
}
for (int i = 0; i < num.length; i++) {
if (num[i]>0) {
count*=(num[i]+1);//公式直接套
}
}
System.out.println(count);
}