首先,这里涉及到的数学知识有:
1.质数:只能被两个或以下的数整除的数
2.合数:能被三个或以上的数整除的数
3.阶乘:是所有小于及等于该数的正整数的积,并且0的阶乘为1。(100的阶乘为1x2x3...x100)
4.约数个数定理:(来自百度)
例子: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结束循环,就不会把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循环结束,
# for j in p循环继续尝试下一个j,直到j > i,满足if条件,break
i //= j
m[j] += 1 # 让对应的质数个数 + 1
s = 1 # 定义一个变量s,用于接收相乘得出的约数个数。(因为是相乘,所以s要等于1)
for i in m.values(): # 所有质因子的个数相乘,就是约数个数了。
s *= i
print(s)