【问题标题】:python, square root simplification functionpython,平方根简化函数
【发布时间】:2015-10-17 20:20:26
【问题描述】:

我正在尝试在 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,")")  

【问题讨论】:

    标签: python


    【解决方案1】:

    这个循环只是简单地尝试除以 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))
    

    【讨论】:

      【解决方案2】:

      这是我为数学作业编写的小代码

      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())
      

      【讨论】:

      • 为什么是双循环? for i in range(2, und_root0): ... for i0 in range(2, und_root0): ...
      • 嗨,欢迎来到 SO。请不要只转储代码作为答案。解释您的思路,以便我们更好地了解您的所作所为。谢谢。
      【解决方案3】:

      如果您的缩进实际上与问题中显示的一样,则您的break 语句需要缩进更多。当第一个if 被击中时,它应该跳出for 循环,而不是跳出while 循环。

      但是代码还有另一个问题。您正在以i1 开始for 循环,但在这种情况下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!
      

      【讨论】:

      • 但它仍然没有得到所有的分隔符。如果出现 4 次,它会跳过一个数字。
      • 不应该。如果您跳出for 循环,它将以i1 并重新计数到再次匹配的i 值。这可能效率不高,但会奏效。
      • 啊,还有一个错误,1 被发现是除数。跳过 1 并从 2 开始可以避免无限循环。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多