##问题描述
定义阶乘n!=1×2×3×.Xn。
请问100!(100的阶乘)有多少个正约数。
##问题分析
##首先,我们要知道对应的约数是什么,以及对应的约数的求法。
约数的定义:
一般地,对自然数n进行质因数分解,设n可以分解为
n=p⑴^α⑴·p⑵^α*⑵·…·p(k)^α(k)
其中p⑴、p⑵、…p(k)是不同的质数,α⑴、α⑵、…α(k)是正整数,
根据乘法原理,n的约数共有:
(α⑴+1)(α⑵+1)…(α(k)+1)个。(求解约数个数的公式 )
负约数:所有正约数的相反数所组成的集合。
##其次,我们将固有的问题进行分解部分为以下几部分:(红色部分为抽象出函数实现具体且有效的功能)
第一部分抽象化出找出质数的函数
第二部分抽象出质因数存储进对应的字典类型中去(根据存储特点进行选择为字典类型,key(质因子)+value(质因子对应的幂次))
第三部分是循环遍历整个的循环范围将所有不是质因数的数进行分解然后加入到对应的质因数的字典中的value中去
第四部分便是将具体的功能进行实现,循环遍历整个字典取出对应的value值加一然后相乘便是最后的结果。
##代码示例
import os
import sys
import math
##代码主体部分
n = 100
zhiysfj = dict()
##第一部分
def is_prime(x):#质数的判断
for i in range(2,int(math.sqrt(x))+1):
if(x % i == 0):
return False
return True
##第二部分
def zhiys(x):#质因数分解的存储
a = []
i = 2
while x != 1:
if(x%i==0 and is_prime(i)):
a.append(i)
x=x//i
else:
i+=1
return a
##第三部分
for i in range(2,n+1):
a = zhiys(i)
for s in a:
if s not in zhiysfj.keys():
zhiysfj[s] = 1
else:
zhiysfj[s] += 1
##第四部分
sm = 1
for v in zhiysfj.values():
sm *=(v+1)
print(sm)
##代码输入样例
##100!
##代码输出样例结果
##39001250856960000