蓝桥杯-python-阶乘约数

##问题描述



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

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值