相关疑难解决方法(0)

确定整数平方根是否为整数的最快方法

我正在寻找最快的方法来确定一个long值是否是一个完美的正方形(即它的平方根是另一个整数):

  1. 我通过使用内置Math.sqrt() 函数以简单的方式完成了它,但我想知道是否有办法通过将自己限制为仅整数域来更快地完成它.
  2. 维护查找表是不切实际的(因为大约有2 31.5个整数,其平方小于2 63).

这是我现在正在做的非常简单直接的方式:

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()的结果,至少在我的机器上没有.
  • 快速逆平方根增快,但它给了不正确的结果对于n> = 410881.然而,所建议BobbyShaftoe,我们可以使用FISR劈对于n <410881.
  • 牛顿的方法慢了一点Math.sqrt().这可能是因为Math.sqrt()使用类似牛顿方法的东西,但在硬件中实现,因此它比Java快得多.此外,牛顿的方法仍然需要使用双打.
  • 一个修改过的牛顿方法,它使用了一些技巧,只涉及整数数学,需要一些黑客来避免溢出(我希望这个函数适用于所有正64位有符号整数),并且它仍然比它慢Math.sqrt().
  • 二进制斩甚至更慢.这是有道理的,因为二进制斩波平均需要16遍才能找到64位数的平方根.
  • 根据John的测试,or在C++中使用语句比使用语句更快switch,但在Java和C#中,or和之间似乎没有区别switch.
  • 我还尝试制作一个查找表(作为64个布尔值的私有静态数组).然后or我会说,而不是开关或声明if(lookup[(int)(n&0x3F)]) { test } else return false; …

java math optimization perfect-square

1403
推荐指数
22
解决办法
26万
查看次数

timeit与时间装饰器

我正在尝试计算一些代码.首先我用了一个时间装饰器:

#!/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 timing timeit

55
推荐指数
6
解决办法
5万
查看次数

python中的整数平方根

在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 ......

python math integer sqrt

51
推荐指数
7
解决办法
5万
查看次数

如何测试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总是返回一个浮点数.我怎样才能做到这一点?

python

3
推荐指数
2
解决办法
210
查看次数

如果在Python中输入大数字时如何有效地找到范围内的完美正方形

问题是当输入数字非常大时,如何有效地找到给定范围内的完美正方形.我的解决方案是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模块的在线编译器上运行)

python largenumber perfect-square

3
推荐指数
1
解决办法
2441
查看次数

Python:确定数字是方形,立方体等的函数

我的一个简单问题是创建一个函数来确定是否可以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=645*5*5=125.如何创建一个找到正方形/立方体/等数字的工作函数?

python algorithm math function division

3
推荐指数
1
解决办法
712
查看次数

如何在Python中将?243更改为9?3?一般如何改变平方根?

我有一个数学/Python 问题,如何将平方根中的大数更改为小数(但仍保留该值),例如 \xe2\x88\x9a243 更改为 9\xe2\x88\x9a3?

\n

我还有一个问题,如何在我的代码中使用它?

\n

代码:

\n
import 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()\n
Run Code Online (Sandbox Code Playgroud)\n

python math square-root

3
推荐指数
1
解决办法
257
查看次数

完美广场上的Python程序

我编写了这个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 python-3.x

2
推荐指数
1
解决办法
1万
查看次数

寻找完美的广场

我有这个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)

python

1
推荐指数
2
解决办法
2万
查看次数

在Python 3中判断一个数字是否是平方数的最快方法是什么

我试图根据列表中的数字是否为平方数来返回 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)

python math numbers function list

1
推荐指数
1
解决办法
1071
查看次数

Python - 检查数字是否为正方形

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

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 integer boolean input

0
推荐指数
3
解决办法
1万
查看次数