2016-02-27 99 views
1

所以问题就这样产生了,我是新来的Python:无论如何去逆阶乘函数?

高清factorial_cap(NUM):对于正整数ñ,n的阶乘(记为ñ!),是产品 从1到n的所有正整数。实现函数返回最小的
正数n使得n!大于或等于参数num。假设:num总是一个正整数。

# Examples 
# factorial_cap(20) output is 4 since 3!<20 but 4!>20 
# factorial_cap(24) output is 4 since 4!=24 
# factorial_cap(1) output is 1 since 1!=1 

# And here is what I got 

def factorial_cap(num): 
    n = 1 
    for i in range (1,num+1): 
     n = n*i  

我很确定这是正确的因子def函数。但我无法弄清楚,而不是获得'总价值',我怎么才能得到正确的输出,正如我上面发布的例子?

顺便说一句,我应该在def结束时使用'return',还是在这种情况下无关紧要?

+0

尝试在for循环之后使用'return n'。同样在你的循环中,将'range(1,num + 1)'改为'range(2,num + 1)',你不必再次乘以1。 – Rolbrok

+0

这是功课吗? –

+0

@BasSwinckels当然是。 –

回答

2

当需要的数量大于或等于当前总数时,需要进行测试。因此,您可以使用while循环的条件来执行该检查,并增加一个计数器i,以跟踪当前迭代。那么它的返回所产生的值> =所需数量的i当前值的问题:

def factorial_cap(num): 
    n = 1 
    i = 1 
    while n < num: 
     i += 1 
     n *= i 
    return i 

>>> factorial_cap(20) 
4 
>>> factorial_cap(24) 
4 
>>> factorial_cap(25) 
5 
>>> factorial_cap(1) 
1 
>>> factorial_cap(3628800) 
10 
0

如果您可以在解决方案中使用阶乘函数,那么解决方案非常简单,因为您可以简单地检查第i阶乘的大小是否大于num。这里有一个解决方案:

def fact(num): 
    if num == 0 or num == 1: 
     return 1 
    f = 1 
    for i in range(2, num + 1): 
     f *= i 
    return f 

def fact_cap(num): 
    i = 1 
    while fact(i) < num: 
     i += 1 
    return i 
+0

我只是想指出,无论如何,mhawke的解决方案在性能方面都更好。但另一方面,这是非常直观的编码和理解。 – nbro

0

你想一回,但不是n,但i

def factorial_cap(num): 

    n = 1 
    i = 0 

    while True: 

     i += 1 
     n = n*i 
     if n >= num: 
      break 

    return i 

print(factorial_cap(20)) 
print(factorial_cap(24)) 
print(factorial_cap(1)) 
-3

您想在此时使用递归,因为它使您的工作更轻松 -

def fact(n): 
    print(factorial(n)) 

def factorial(n): 
    if n==0 or n==1: 
     return 1 
    else: 
     return n*factorial(n-1) 



And sample run for n=5 is: 
>>120 

+5

然而你根本没有回答这个问题......或者解决问题。 –

+0

@EddoHintoso你在说什么?代码有问题吗? – user2719152

+0

@ user2719152:重点是,我想。你的回答并不回答这个问题。你的答案是阶乘函数的递归实现,然而,OP请求了阶乘函数(种类)的倒数,即给出了一些数字,它是产生它的'factorial(n)'中的'n'。 – mhawke