python确定一个数是不是完全平方数

Python032

python确定一个数是不是完全平方数,第1张

1. 与依赖于任何浮动的问题(math.sqrt(x)或x**0.5)是你不能真正确定它的准确(对充分大的整数x,它不会是,甚至有可能溢出)。幸运的(如果是不急于-)有很多纯整数的方法,如下面的...:

def is_square(apositiveint):

x = apositiveint // 2

seen = set([x])

while x * x != apositiveint:

x = (x + (apositiveint // x)) // 2

if x in seen: return False

seen.add(x)

return True

for i in range(110, 130):

print i, is_square(i)

提示:它是基于“巴比伦算法”的平方根,请参阅维基百科。它适用于任何正数,而您有继续 编辑:让我们看一个例子...

x = 12345678987654321234567 ** 2

for i in range(x, x+2):

print i, is_square(i)

这种版画,根据需要(和太-)一个合理的金额:

152415789666209426002111556165263283035677489 True

152415789666209426002111556165263283035677490 False

请您提出了一种基于浮点结果的解决方案之前 CodeGo.net,确保他们正确地工作在这个简单的例子-它不是那么难(你只需要一些额外的检查,以防是有点过),只是需要多一点的关怀。 然后尝试用x**7并找到解决您会得到这个问题巧妙的方式,

OverflowError: long int too large to convert to float

你必须得到越来越多的聪明的数量不断增加,当然。 如果我很着急,当然,我gmpy-但后来,我明显偏向-)。

>>>import gmpy

>>>gmpy.is_square(x**7)

1

>>>gmpy.is_square(x**7 + 1)

0

是啊,我知道,这只是很容易感觉像作弊(有点我总体感觉对Python的-)的方式-没有聪明可言,只是完美的直接和简单(和,在gmpy,绝对速度的情况下-) ...

2. 用牛顿的快速零最接近的整数的平方根,那么它平方,看看它是否是你的号码。见isqrt。

3. 因为你永远无法靠当浮动(如计算平方根的这些方式),一个不易出错将是对处理

import math

def is_square(integer):

root = math.sqrt(integer)

if int(root + 0.5) ** 2 == integer:

return True

else:

return False

想像integer是9。math.sqrt(9)可能是3.0的,但它也可以是像2.99999或3.00001,因此现蕾结果马上是不可靠的。知道int取整数值,通过增加浮点值0.5我们会得到我们要找的,如果我们是在一个范围内的值,其中float仍然有足够细的分辨率来表示附近的一个为我们所期待的数字。

4. 我是新来的堆栈溢出,并做了一个快速脱脂找到解决的办法。我只是张贴在另一个线程(寻找完美的正方形)上的例子,一个细微的变化上面,我想我会包括什么,我贴在这里有一个细微的变化(使用nsqrt作为一个临时变量),如果它的利益/使用:

import math

def is_perfect_square(n):

if not ( ( isinstance(n, int) or isinstance(n, long) ) and ( n >= 0 ) ):

return False

else:

nsqrt = math.sqrt(n)

return nsqrt == math.trunc(nsqrt)

5. 你可以二进制搜索的圆形平方根。平方的结果,以确定它的原始值相匹配。 你可能会更好过与FogleBirds回答-虽然小心,因为浮点数是近似的,它可以抛出这种方法了。你可以在原则上得到一个假阳性从一个大的整数,较完美的正方形,例如,由于丢失精度1以上。

6.

>>>def f(x):

... x = x ** 0.5

... return int(x) == x

...

>>>for i in range(10):

... print i, f(i)

...

0 True

1 True

2 False

3 False

4 True

5 False

6 False

7 False

8 False

9 True

7. 决定多久的数量就越大。 采取增量0.000000000000 ....... 000001 见,如果(SQRT(X))^ 2-x是大于/等于/大于δ较小并且基于增量误差决定。

8. 我不知道Python的,但你可以不喜欢:

function isSquare(x) = x == floor(sqrt(x) + 0.5)^2

也就是说,拿一个数,求平方根,四舍五入到最接近的整数,它平方,并测试它是作为原来的号码。 (floor并加入0.5做是为了防止类似案件sqrt(4)回国1.9999999...由于浮点运算,麦克grahams指出。) 如果你有兴趣,曾经有一个很好的判断以最快的方式,如果一个整数的平方根是一个整数。 编辑澄清。

9. 该回复不属于你的declarative的问题,而是一个隐含的问题,我在您发布的代码中看到,即“如何检查是否是整数?” 优先个回答你通常得到这个问题是“不要!”并且这是真的,在Python,类型检查不应该做的事情。 对于那些极少数的异常,不过,不是寻找数字的字符串表示小数点,那东西做isinstance函数:

>>>isinstance(5,int)

True

>>>isinstance(5.0,int)

False

当然适用于变量,而不是一个值。如果我想确定该值是否是一个整数,我会做到这一点:

>>>x=5.0

>>>round(x) == x

True

但正如其他人已经详细介绍,也有这种事情的大多数非玩具的例子来加以考虑浮点问题。

10. 我有轻微的原始巴比伦的方法。取而代之的是一套以存储每个生成的近似,只是最近的两个近似的存储和核对电流近似。这保存了大量的通过整套的近似值的浪费检查。我的java,而不是python和BigInteger类,而不是一个正常的原始整数。

BigInteger S = BigInteger.ZERO

BigInteger x = BigInteger.ZERO

BigInteger prev1 = BigInteger.ZERO

BigInteger prev2 = BigInteger.ZERO

Boolean isInt = null

x = S.divide(BigInteger.valueOf(2))

while (true) {

x = x.add(preA.divide(x)).divide(BigInteger.valueOf(2))

if (x.pow(2).equals(S)) {

isInt = true

break

}

if (prev1.equals(x) || prev2.equals(x)) {

isInt = false

break

}

prev2 = prev1

prev1 = x

}

在 Python 中创建一个类及其对象

在 Python 中创建一个空类

在 Python 中使用 Type 创建类

在 Python 中创建和调用类的方法

使用 __init__() 方法为数据属性赋值

在 Python 中更新对象属性

在 Python 中删除对象属性和对象

在 Python 中检查和比较对象的类型

在Python中将对象的所有属性复制到另一个对象

在 Python 中迭代对象属性

在 Python 中打印对象的所有属性

在python中在运行时创建类的数据属性

在函数中将对象的实例作为参数传递

在 Python 中创建和使用自定义 Self 参数

使用self参数来维护对象的状态

在 Python 中创建和使用静态类变量

在 Python 中的一个函数上使用多个装饰器

在 Python 中的方法中同时访问 cls 和 self

从装饰器访问实例方法的类

使用给定的装饰器获取 Python 类的所有方法

装饰一个 class

将类字段作为参数传递给类方法上的装饰器

在 Python 中创建多个传入参数列表的类变量

Python 中的 wraps 装饰器

使用可选参数构建装饰器

在 Python 中将参数传递给装饰器

@property 装饰器

类和函数的装饰器

Python 中带参数和返回值的装饰器

Python 使用参数 wraps 装饰器

Python 装饰器获取类名

简单装饰器示例

在 Python 中使用 print() 打印类的实例

在 Python 中的类中将装饰器定义为方法

获取在 Python 中修饰的给定类的所有方法

带参数和不带参数的 Python 装饰器

Python 中带有 self 参数的类方法装饰器

在 Python 中的另一个类中使用隐藏的装饰器

装饰器内部的 self 对象

在 Python 中将多个装饰器应用于单个函数

Python 装饰器获取类实例

__init__ 和 __call__ 有什么区别

在 Python 中使用 __new__ 和 __init__

Python 中的迭代重载方法

在 Python 中使用迭代器反转字符串

Python 中 __reversed__ 魔术方法

Python 中的 __getitem__ 和 __setitem__

在 Python 中使用 __getattr__ 和 __setattr__ 进行属性赋值

什么是 __del__ 方法以及如何调用它

创建类的私有成员

一个 Python 封装的例子

一个 Python 组合的例子

一个Python聚合的例子

Python 中的单级、多级和多级继承

在 Python 中获取一个类的父类

Python 中的多态性

访问 Child 类中的私有成员

Python 中的抽象类

创建一个抽象类来覆盖 Python 中的默认构造函数

使一个抽象类继承另一个抽象类

Python 中的 super 是做什么的

super() 如何在多重继承中与 __init__() 方法一起工作

将 super 与类方法一起使用

mro 是做什么的

Python 中的元类是什么

元类的具体案例

在 Python 中使用元类的单例类

@staticmethod 和 @classmethod 有什么区别

Python 中的装饰器是什么

制作函数装饰器链

python语言是区分大小写的。

Python的变量名是区分大小写的,例如:name和Name就是两个变量名,而非相同变量。

python在赋值的执行中可以绑定不同类型的值,这个过程叫做变量赋值操作,赋值同时确定了变量类型。

注意:在赋值时,值是什么数据类型,就决定了这个变量的类型,变量名引用了数值的同时也引用了它的类型。

扩展资料

变量命名规范

1、变量名可以包括字母、数字、下划线,但是数字不能做为开头。例如:name1是合法变量名,而1name就不可以。

2、系统关键字不能做变量名使用。

3、除了下划线之外,其它符号不能做为变量名使用。

Python语法规则:

1、块和语句的边界会自动检测。

就像我们所见到的,Python的程序块中没有大括号或者像pascal语言那种begin/end 等分割字符;反之,Python使用首行下的语句缩进把嵌套块内的语句组合起来。同样的,Python语句一般是不以分号终止的,一行末尾通常就是该行所写语句的结尾。

2、复合语句=首行+”:”+缩进语句

Python中所有的复合语句都遵循相同格式:首行会以冒号终止,在接一个或多个嵌套语句,而且通常都是在首行下缩进的。缩进语句叫做块。在if语句中,elif和else分句是if的一部分,也是其本身嵌套块的首行。