蓝桥杯求100!的正约数
这个问题猛地一看好像不能用暴力求解,他就是不能用暴力求解,因为这个数太大了。
怎么解决
1、首先我们要把1*2*3…100的质因数全部求出来。
用暴力求解去遍历1~100,每个数的质因数,然后存在一个result的全局列表中
2、在计算每个质因数出现的次数,这里我用的是字典存储每个数字出现的次数
这里涉及到一个计算公式
$$
整数=质因数n*质因数m
$$
整数的约数的个数=(n+1)∗(m+1) 整数的约数的个数=(n+1)*(m+1) 整数的约数的个数=(n+1)∗(m+1)
例如
$$
12=223=2^2*3
12的约数的个数就是n
12的约数的个数就是n
12的约数的个数就是n
n=(2+1)*(1+1)
$$
他们分别是1,2,3,4,6,12
100!的代码
result = [] # 存取所有的质因数
dirct = {} #存放质因数出现的次数
count = 1
def demo(n):#求解质因数的函数
k = 2
global result
while n > 1:
if n % k == 0:
result.append(k)
n = n / k
else:
k += 1
# 求解每个数的质因数
for i in range(2, 101):
demo(i)
print(result)
# 记录每个质因数出现的次数
for i in result:
if i not in dirct.keys():
dirct[i] = 1
else:
dirct[i] += 1
print(dirct)#质因数出现的次数
# 计算约数出现的次数
for values in dirct.values():
count *= (values + 1)
print(count)
以上内容仅供参考:
算出的答案:39001250856960000
该博客介绍了如何不用暴力求解计算100!的正约数个数。通过分解1到100所有数的质因数,并统计每个质因数的出现次数,利用公式(n+1) * (m+1)计算每个质因数对约数个数的贡献,最终相乘得到总约数个数。博主提供了Python代码示例来实现这一过程,并得到了正确答案39001250856960000。
663

被折叠的 条评论
为什么被折叠?



