思特奇杯·云上蓝桥 -算法 集训营第一周-2.阶乘约数

博客探讨了如何计算100的阶乘的约数个数。通过解法一,利用质因数分解的方法,分别计算每个质因数的指数加一后相乘得到结果。提供的Python和Java代码实现了解题思路,最终得出100!的约数个数为39001250856960000。
摘要由CSDN通过智能技术生成

题目描述

定义阶乘 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);
	}

}

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值