【问题标题】:Python - Check if a number is a squarePython - 检查数字是否为正方形
【发布时间】:2017-11-15 19:08:56
【问题描述】:

我写了一个函数,返回输入的数字是否为正方形

def is_square(n):
    if n<1:
        return False
    else:
        for i in range(int(n/2)+1):
            if (i*i)==n:
                return True
            else:
                return False

我相信这段代码可以正常工作。但是当我做测试用例时,例如:test.expect( is_square( 4)),它说该值不是预期的。

【问题讨论】:

  • is_square(1) 的值是多少?还是is_square(4)?或者is_square(n**2) 代表任何n
  • 看起来您首先要尝试的是if (1*1)==n。除非n==1,否则你的测试会失败。
  • 您应该使用print 语句测试您的代码,然后才能确信您的代码可以正常工作。
  • 请添加输入和输出示例,并更具体地说明您的问题。
  • 如果您需要任何其他解决方案来解决完美的根本问题,您可以找到here

标签: python input integer boolean


【解决方案1】:

在 Python 3.8+ 中,使用这个:

def is_square(n):
    root = math.isqrt(n)
    return n == root * root

【讨论】:

    【解决方案2】:
    def is_square(n):
    if n< 0:
        return False
    return round(n ** 0.5) ** 2 == n
    

    【讨论】:

      【解决方案3】:

      您可以简单地使用 simpy 模块 将其导入为,

      from sympy.ntheory.primetest import is_square 
      

      你可以像这样检查一个数字:

      is_square(number) 
      

      它会返回一个布尔值

      【讨论】:

        【解决方案4】:

        另一种方法:

            def SQRT(x):
                import math
                if math.sqrt(x) == round(math.sqrt(x)):
                    return True
                else:
                    return False
        

        【讨论】:

          【解决方案5】:

          假设 n >= 0:

          def is_square(n):
              tmp = int(n ** 0.5)
              return n == tmp * tmp
                    
          print(is_square(81), is_square(67108864 ** 2 + 1))  # True False
          

          【讨论】:

            【解决方案6】:

            最简单的工作解决方案,但不适用于大量。

            def squaretest(num):
                sqlist=[]
                i=1
                while i**2 <= num:
                    sqlist.append(i**2) 
                    i+=1
                return num in sqlist
            

            【讨论】:

              【解决方案7】:
              def myfunct(num):
                  for i in range(0,num):
                      if i*i==num:
                          return 'square'
                  else:
                      return 'not square'
              

              【讨论】:

              • 虽然此代码可以回答问题,但提供有关 如何为什么 解决问题的附加上下文将提高​​答案的长期价值。
              【解决方案8】:

              由于 math.sqrt() 返回一个浮点数,我们可以将它转换为一个字符串,将它从 "." 中拆分出来。并检查右边的部分(小数点)是否为0。

              import math
              def is_square(n):
              x= str(math.sqrt(n)).split(".")[1]  #getting the floating part as a string.
              return True if(x=="0") else False
              

              【讨论】:

                【解决方案9】:

                Python 哲学的主要思想是编写简单的代码。检查一个数字是否是一个完美的正方形:

                def is_square(n):
                    return n**0.5 == int(n**0.5)
                

                当对一个浮点数加幂时,你可以找到一个数的根。

                【讨论】:

                • 一旦你的数字变得非常大,这就会失去精度:is_square(67108864**2 + 1) 产生True
                • @TemporalWolf 引用 [micsthepick] (stackoverflow.com/a/37197669/8156982) 如果你想检查大得离谱的案例,你应该使用巴比伦算法方法,但这对于简单的案例来说很好,比如找到低于 100 万的完美平方数或其他类似的蛮力算法。
                • 这种方法不一定有错,但我喜欢提前承认限制。
                【解决方案10】:

                要坚持基于整数的算法,您可以查看二进制搜索的实现以找到平方根:

                def is_square(n):
                    if n < 0:
                        return False
                    if n == 0:
                        return True
                    x, y = 1, n
                    while x + 1 < y:
                        mid = (x+y)//2
                        if mid**2 < n:
                            x = mid
                        else:
                            y = mid
                    return n == x**2 or n == (x+1)**2
                

                【讨论】:

                • 这个解决方案在平均和最坏情况下的运行时间是多少?
                • 最坏和最一般的情况是log n,而您的解决方案是n/2
                【解决方案11】:

                要检查一个数字是否为正方形,您可以使用如下代码:

                import math
                number = 16
                if math.sqrt(number).is_interger:
                        print "Square"
                else:
                        print "Not square"
                

                import mathimports math 模块。

                if math.sqrt(number).is_interger: 检查number 的平方根是否为整数。如果是这样,它将print Square。否则会printNot square

                【讨论】:

                • math.sqrt(67108864**2 + 1).is_integer() 产生True 浮点精度有限制。
                【解决方案12】:

                您的函数实际上不起作用,因为它会在找到第一个非平方根时立即返回 False。相反,您需要将代码修改为:

                def is_square(n):
                    if n<1:
                        return False
                    else:
                        for i in range(int(n/2)+1):
                            if (i*i)==n:
                                return True
                        return False
                

                只有在检查了所有可能的平方根后才返回 false。您可能还想查看math.sqrt()float.is_integer()。使用这些方法,你的函数会变成这样:

                from math import sqrt
                
                def is_square(n):
                    return sqrt(n).is_integer()
                

                请记住,此方法不适用于非常大的数字,但您的方法会非常慢,因此您必须选择使用哪个。希望我能帮上忙!

                【讨论】:

                • 顺便说一句,看到这样的算法让我的眼睛流血了。
                • 哈哈,这是真的!嗯嗯,按照OP的方法。
                • 编辑添加另一个(更清洁的)方法。
                • math.sqrt 只是近似值,就像大多数浮点运算一样。如果您想知道整数是否为正方形,math.sqrt 不适合使用。 Here's a demo of your is_square failing.
                • 编辑以反映这一点。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-11-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-10-03
                相关资源
                最近更新 更多