任何数都可以表示成若干个素数的乘积,即写成如下形式
则该数的约数个数为
所有约数和为
例如56的约数有1、2、4、7、8、14、28、56共8个,和为120
56=2^3*7
根据约数个数公式:(1+3)(1+1)=8
根据约数和公式:(1+2+2^2+2^3)(1+7)=15*8=120
代码实现
n = int(input())
p = [] # 存储质因数
k = [] # 存储质因数的次方
number = 1 # 因数个数
sum = 1 # 因数和
# 求n的所有质因数和对应的次方
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
ans = 0 # 该因数个数
p.append(i)
while n % i == 0: # 一直除以该因子,直到除不尽消除该因子,除以了多少下就说明该质因数有多少次方
n = n // i
ans = ans + 1
k.append(ans)
if n != 1: # 如果最后除出来结果不是1,说明还剩个素因数
p.append(n)
k.append(1)
print(p)
print(k)
for i in range(len(p)): # (1+k_1)(1+k_2+1)(1+k_3)...(1+k_m)
number = number * (1 + k[i])
for i in range(len(p)): # (1+p_1^1+p_1^2+...+p_1^(k_1))(1+p_2^1+p_2^2+...+p_2^(k_2))...(1+p_m^1+p_m^2+...+p_m^(k_m))
x = 0
for j in range(k[i] + 1):
x = x + p[i] ** j
sum = sum * x
print(number)
print(sum)
结果
例如下面的题目
q = [0 for i in range(101)] # 设q列表,q1表示1因子的次方,q2表示2因子的次方,q2表示3因子的次方
ans = 1
for n in range(1, 101):
for i in range(2, int(n ** 0.5) + 1): # 找素因子
while n % i == 0:
n = n // i
q[i] = q[i] + 1 # 每成功除以一下就加1
if n != 1:
q[n] = q[n] + 1
for i in range(1, 101):
if q[i] != 0:
ans = ans * (1 + q[i]) # 约数个数公式
print(ans)
#结果:39001250856960000