2015-10-17 59 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