【超详细】(蓝桥杯Python)阶乘约数:求100阶乘的正约数个数。

 首先,这里涉及到的数学知识有:

1.质数:只能被两个或以下的数整除的数

2.合数:能被三个或以上的数整除的数

3.阶乘:是所有小于及等于该数的正整数的积,并且0的阶乘为1。(100的阶乘为1x2x3...x100)

4.约数个数定理:(来自百度)

【超详细】(蓝桥杯Python)阶乘约数:求100阶乘的正约数个数。_第1张图片

 例子:100可以表示为100=2^2*5^2

            那么100的正约数的个数就是(2+1)(2+1)=9

            也就是    (质数的指数+1)    的累乘。

作者的话:

本人深入理解了解题代码,每段代码都写上了详细注释

如果您想深入理解该题,跟着我的注释的思路走会更容易些,希望我能帮到您。

若有不妥之处,还望您给予反馈。



"""
要进行质因数分解
随后用到求约数个数的公式:(每个质数的次幂+1)的累乘
"""


# 阶乘约数


"""
100的阶乘,可表示为1x2x3...x100
因此可以对参与阶乘的2,3,4,5,6到100进行质因数分解
既然质因数分解的数最高也就100
那么定义n = 100,也就是要质因数分解的最大的数,就能收集到所需的质数了。
"""

n = 100
p = [2]     # 质数集,其中2为特例,需要单独加入


for i in range(3, n + 1):
    j = 2
    while j < i:
        if i % j == 0:      # 如果有比 i 小的数可以将i整除,就表示i为合数,break结束while循环,就不会执行else中的代码,即不把i加入质数集中.
            break
        j += 1
    else:
        p.append(i)


m = {}
for i in p:
    m[i] = 1  # 每个质数初始为1,对应公式:”(某一质数的次数 + 1) * (某二质数的次数 + 1)“   中的1。


for i in range(2, n + 1):
                             # 遍历 [2, 100]    对应100的阶乘为1x2x3...x100。
    for j in p:              # 遍历质数,将每个参与100阶乘中的数都质因数分解一下。# (比如 6 分解成 2*3 ,12 分解成 2*2*3)
        if j > i:            # 当所遍历到的质数比要进行质因数分解的数要大时,就直接结束这一层for j in p循环。
            break
        while i % j == 0:    # 这里是看 i 可以被 "当前 j" 整除多少次,
                             # 当 i 不能再被 "当前 j" 整除时,while循环结束。
            i //= j

            m[j] += 1        # 让对应的质数个数 + 1

s = 1   # 定义一个变量s,用于接收相乘得出的约数个数。(因为是相乘,所以s要等于1)


for i in m.values():        # 所有质因子的个数相乘,就是约数个数了。
    s *= i
print(s)

你可能感兴趣的:(算法,数据结构,python,蓝桥杯)