(算法)阶乘除法

今天看到一道算法题,名为“阶乘除法”,题目如下

输入两个正整数 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)

观察后发现如下特点:

  1. k<=1时不存在答案,k>1时必然存在答案(k!/(k-1)!=k)
  2. 若k为奇数,则答案必然为n=k,m=k-1。原因是连续数字相乘必然为偶数。
  3. 若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

在手机上阅读或分享本文请扫描以下二维码:
By @Zhengyi Yang in
Tags : #factorial, #python,

Comments

评论功能已关闭。