我正在寻找最快的方法来确定一个long值是否是一个完美的正方形(即它的平方根是另一个整数):
Math.sqrt()
函数以简单的方式完成了它,但我想知道是否有办法通过将自己限制为仅整数域来更快地完成它.这是我现在正在做的非常简单直接的方式:
public final static boolean isPerfectSquare(long n)
{
if (n < 0)
return false;
long tst = (long)(Math.sqrt(n) + 0.5);
return tst*tst == n;
}
Run Code Online (Sandbox Code Playgroud)
注意:我在许多Project Euler问题中使用此函数.因此,没有其他人必须维护此代码.而这种微优化实际上可以产生影响,因为部分挑战是在不到一分钟的时间内完成每个算法,并且在某些问题中需要将此函数调用数百万次.
我尝试过不同的问题解决方案:
0.5不需要添加Math.sqrt()的结果,至少在我的机器上没有.Math.sqrt().这可能是因为Math.sqrt()使用类似牛顿方法的东西,但在硬件中实现,因此它比Java快得多.此外,牛顿的方法仍然需要使用双打.Math.sqrt().or在C++中使用语句比使用语句更快switch,但在Java和C#中,or和之间似乎没有区别switch.or我会说,而不是开关或声明if(lookup[(int)(n&0x3F)]) { test } else return false; …我正在尝试计算一些代码.首先我用了一个时间装饰器:
#!/usr/bin/env python
import time
from itertools import izip
from random import shuffle
def timing_val(func):
def wrapper(*arg, **kw):
'''source: http://www.daniweb.com/code/snippet368.html'''
t1 = time.time()
res = func(*arg, **kw)
t2 = time.time()
return (t2 - t1), res, func.__name__
return wrapper
@timing_val
def time_izip(alist, n):
i = iter(alist)
return [x for x in izip(*[i] * n)]
@timing_val
def time_indexing(alist, n):
return [alist[i:i + n] for i in range(0, len(alist), n)]
func_list = [locals()[key] for key in locals().keys()
if callable(locals()[key]) and key.startswith('time')]
shuffle(func_list) # …Run Code Online (Sandbox Code Playgroud) 在python或标准库中是否存在整数平方根?我希望它是准确的(即返回一个整数),并且如果没有解决方案则吠叫.
目前我推出了自己的天真的:
def isqrt(n):
i = int(math.sqrt(n) + 0.5)
if i**2 == n:
return i
raise ValueError('input was not a perfect square')
Run Code Online (Sandbox Code Playgroud)
但它很难看,我不相信大整数.如果我超过了这个值,我可以遍历正方形并放弃,但我认为做这样的事情会有点慢.另外我想我可能正在重新发明轮子,这样的东西肯定已经存在于python ......
我的代码是
if graph == square_grid and type(math.sqrt(nodes)) is not int:
print "Your netork can't have that number of nodes"
Run Code Online (Sandbox Code Playgroud)
当然这不起作用,因为math.sqrt总是返回一个浮点数.我怎样才能做到这一点?
问题是当输入数字非常大时,如何有效地找到给定范围内的完美正方形.我的解决方案是Time Limit Exceeded错误.我已经检查了以下链接,但它们没有解决我的问题:
- 完美广场上的Python程序
- 我如何检查一个数字是否是一个完美的正方形?
- 确定整数的平方根是否为整数的最快方法(我不知道如何实现Python中此链接中给出的解决方案).
问题是:
输入格式:第一行包含T,即测试用例的数量.随后是T测试用例,每个测试用例都在换行符中.每个测试用例包含两个空格分隔的整数,表示A和B.查找A和B范围内的所有完美正方形(包括两者).
输入示例:
2 3 9 17 24
我写的代码是:
import math
def is_perfect_square(n):
return n % n**0.5 == 0
t = int(raw_input())
for i in range(t):
numbers = map(int, raw_input().split())
count = 0
for j in xrange(numbers[0], numbers[1] + 1): # I also tried range() which gave memory error
if (is_perfect_square(j)):
count = count + 1
print count
Run Code Online (Sandbox Code Playgroud)
虽然此代码适用于较小的数字,但它Time limit exceeded为大输入提供了错误.
(注意:gmpy不是一个选项,因为代码必须在没有gmpy模块的在线编译器上运行)
我的一个简单问题是创建一个函数来确定是否可以a^n为某些给定的n 写入数字N ,即我需要检查是否N^(1/n)是整数.不知何故,此函数产生错误的结果:
def is_power(N, n):
r = float(N) ** ( 1. / float(n) )
return r.is_integer()
Run Code Online (Sandbox Code Playgroud)
因为n=2它有效.
对于n=3和N = 1,8,27,函数产生True,这是正确的.但是从那时起就是假的,例如为4*4*4=64或5*5*5=125.如何创建一个找到正方形/立方体/等数字的工作函数?
我有一个数学/Python 问题,如何将平方根中的大数更改为小数(但仍保留该值),例如 \xe2\x88\x9a243 更改为 9\xe2\x88\x9a3?
\n我还有一个问题,如何在我的代码中使用它?
\n代码:
\nimport math\ndl=int(input("Podaj d\xc5\x82ugo\xc5\x9b\xc4\x87: "))\nc=input("Kt\xc3\xb3ry bok: przypdl, przypkr, przec: ")\ndef find(x):\n global przypkr\n global przec\n global przypdl\n if c=="przec":\n przec=x\n przypkr=x/2\n przypdl=przypkr*math.sqrt(3)\n elif c=="przypkr":\n przypkr=x\n przypdl=x*math.sqrt(3)\n przec=x*2\n else:\n przypdl=x\n przypkr=x/math.sqrt(3)\n przec=przypkr*2\n print(f'przeciwprostok\xc4\x85tna: {przec}, kr\xc3\xb3tsza przyprostok\xc4\x85tna: {przypkr}, d\xc5\x82u\xc5\xbcsza przyprostok\xc4\x85tna: {przypdl} \xe2\x88\x9a{przypdl*przypdl}')\nfind(dl)\n\ndef obw():\n print(f'Obw\xc3\xb3d r\xc3\xb3wna si\xc4\x99: {przec + przypkr + przypdl} lub {przec + przypkr} + \xe2\x88\x9a{przypdl*przypdl}')\n\nobw()\nRun Code Online (Sandbox Code Playgroud)\n 我编写了这个python函数,它将列表作为参数,并确定列表中的哪些元素是完美的正方形,然后返回仅包含那些选择元素的新列表.
这是我的功能:
def square(n):
return n**2
def perfectSquares1(L):
import math
m=max(L)
for n in L:
if type(n) is int and n>0:
Result=map(square,range(1,math.floor(math.sqrt(m))))
L1=list(Result)
L2=list(set(L).intersection(set(L1)))
return L2
Run Code Online (Sandbox Code Playgroud)
但是现在我想重新尝试一下:我想编写一个单行布尔函数,它将n作为参数,如果n是一个完美的正方形则返回True,否则返回false.
有什么建议?我无法想办法让它只有一条线.
我有这个python代码:
def sqrt(x):
ans = 0
if x >= 0:
while ans*ans < x:
ans = ans + 1
if ans*ans != x:
print x, 'is not a perfect square.'
return None
else:
print x, ' is a perfect square.'
return ans
else:
print x, ' is not a positive number.'
return None
y = 16
sqrt(y)
Run Code Online (Sandbox Code Playgroud)
输出是:
16 is not a perfect square.
Run Code Online (Sandbox Code Playgroud)
虽然这完美地运作:
x = 16
ans = 0
if x >= 0:
while ans*ans < x:
ans …Run Code Online (Sandbox Code Playgroud) 我试图根据列表中的数字是否为平方数来返回 True/False 输出。
该列表需要多次检查,并且列表可以是任何正整数,这意味着该整数可能非常大,事实上,对于使用涉及 math.sqrt() 函数的其他解决方案来说太大,这会产生所示的溢出错误这里:
userList = [1*10**1000]
print ([x for x in userList if math.sqrt(x).is_integer()])
>>>Traceback (most recent call last):
print ([x for x in userList if math.sqrt(x).is_integer()])
OverflowError: int too large to convert to float
Run Code Online (Sandbox Code Playgroud)
这是我的*方法:
def squares():
for i in userList:
if i in squares: #the list in which all the square numbers are stored
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
*我当前的想法是将平方数预先准备到一个单独的列表中,以便比较它们,但我可能正在寻找一种替代的、更快的方法,因为 userList 可能会变得非常大。
我想将返回的输出存储在单独的列表中,如下所示:
out = []
for …Run Code Online (Sandbox Code Playgroud) 我写了一个函数,它返回一个数字输入是否为正方形
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
Run Code Online (Sandbox Code Playgroud)
我相信这段代码有效.但是,当我做测试用例时,例如:test.expect( is_square( 4)),它表示该值不是预期的值.
python ×10
math ×5
function ×2
integer ×2
algorithm ×1
boolean ×1
division ×1
input ×1
java ×1
largenumber ×1
list ×1
numbers ×1
optimization ×1
python-3.x ×1
sqrt ×1
square-root ×1
timeit ×1
timing ×1