2015-10-17 58 views
0

我试图在python中将一个函数简化为一个根下的整数。例如:蟒蛇,平方根简化函数

  • √(27)= 3√(3)
  • √(567)= 9√(7)

我写了下面的功能,但它的工作部分,因为我认为while循环无效。 请帮忙吗?

def sqrt2(num): 
    numbers=[] 
    roots=[] 
    #i=1-11 
    while num>1:  
     for i in range(1,num+1): 
      if num%i==0:  
       num=num//i 
       if num%i==0: 
        num=num//i 
        numbers.append(i) 
       else: 
        roots.append(i) 
     break 

    result=1 
    for i in numbers: 
     result= result*i 
    u_root=1 
    for j in roots: 
     u_root=u_root*j 

    print (result,"sqrt (",u_root,")") 

回答

0

如果你的缩进实际上是因为它出现在的问题,您break语句需要缩进更多。当第一个if被击中时,它应该突破for循环,而不是突破while循环。

但代码还有另一个问题。您正在开始for循环,i1,但在这种情况下num % 1将始终为真,从而导致无限循环。您应该跳过i=1和环路上range(2, num+1)

while num>1:  
    for i in range(2,num+1): # start range with 2 
     if num%i==0:  
      num=num//i 
      if num%i==0: 
       num=num//i 
       numbers.append(i) 
      else: 
       roots.append(i) 
      break # increase indent on this line by two levels! 
+0

取得什么代码,但它门槛并没有得到所有分频器。如果出现4次,它跳过一个数字。 – lilezek

+1

它不应该。如果你跳出'for'循环,它将会以'I'为'1'的方式重新开始,然后重新计数到再次匹配的'i'值。这可能不是非常有效,但它会起作用。 – Blckknght

+0

啊,还有一个bug,其中'1'被认为是除数。跳过1并从2开始可避免无限循环。 – Blckknght

0

这个循环仅仅通过2 * 2,3 * 3,4 * 4等试图分裂,直到它找到一个除数或直到除数对于过大分数。

唯一有趣的部分是递归。如果找到部分结果,我们尝试简化较小的数字。例如。 567 =(3 * 3)* 63,然后63 =(3 * 3)* 7。这两个结果结合起来(9 * 9)* 7。

def my_sqrt(num): 
    for i in range(2, num): 
     div, mod = divmod(num, i*i) 
     if mod == 0: 
      sq1, sq2 = my_sqrt(div) 
      return (i * sq1, sq2) 
     if div == 0: 
      break 
    return (1, num) 

print(my_sqrt(27)) 
print(my_sqrt(567)) 
0

,这里是我的数学作业

def sqr_sim(und_root): 
 
    und_root = int(und_root) 
 
    und_root0 = round(und_root) 
 
    rt_fc = [] 
 
    coef = 1 
 
    if und_root < 0: 
 
     return None 
 
    elif und_root == 0: 
 
     return 0 
 
    else: 
 
     for i in range(2, und_root0): 
 
      if und_root%(i**2) == 0: 
 
       rt_fc.append(i) 
 
       und_root /= i**2 
 

 
       for i0 in range(2, und_root0): 
 
        if und_root%(i0**2) == 0: 
 
         rt_fc.append(i0) 
 
         und_root /= i0**2 
 

 
     for ele in rt_fc: 
 
      coef *= ele 
 
     print('the final solution is', 
 
       coef, '√', und_root) 
 

 
sqr_sim(input())

+0

为什么双循环? '因为我在范围(2,und_root0):...在范围I0(2 und_root0):...' –

+0

嗨,欢迎SO。请不要将代码转储为答案。解释你的思路,以便我们能更好地理解你所做的。谢谢。 – Cthulhu