今天看到一道算法题,名为“阶乘除法”,题目如下
输入两个正整数 n, m,输出 n!/m!,其中阶乘定义为 n!= 1*2*3*...*n (n>=1)。 比如,若 n=6, m=3,则 n!/m!=6!/3!=720/6=120。是不是很简单?现在让我们把问题反过来:输入 k=n!/m!,找到这样的整数二元组(n,m) (n>m>=1)。如果答案不唯一,n 应该尽量小。比如,若 k=120,输出应该是 n=5, m=1,而不是 n=6, m=3,因为 5!/1!=6!/3!=120,而 5<6。
样例输入 | 样例输出 |
---|---|
120 | (5,1) |
1 | None |
210 | (7,4) |
观察后发现如下特点:
- k<=1时不存在答案,k>1时必然存在答案(k!/(k-1)!=k)
- 若k为奇数,则答案必然为n=k,m=k-1。原因是连续数字相乘必然为偶数。
- 若k为偶数且答案不为n=k,m=k-1时,那么n*(n-1)<=k<=n!,(m+1)*(m+1)<=k。
根据这些特点可以找出符合条件的n和m,主要是在历遍时控制好循环的范围。
def solution(k):
if k < 2:
return None
if k % 2 == 0:
i = 2
while i * i <= k:
j = i + 1
p = i
while p < k:
p *= j
if p == k:
return j, i-1
j += 1
i += 1
return k, k-1
在手机上阅读或分享本文请扫描以下二维码:
Comments