首页 > 解决方案 > 有没有办法找到下一个完美的正方形?

问题描述

这是我的代码,但是它只返回下一个数字(例如,取 121 它返回 122 而不是 144),但我不明白为什么。

import math 
def find_next_square(sq):
    # Return the next square if sq is a square, -1 otherwise
    if math.sqrt(sq).is_integer:
        sqnext = sq + 1
        if math.sqrt(sqnext).is_integer:
            return sqnext
    else:
        return -1

标签: pythonnextsquare

解决方案


你的逻辑不正确。使用sqnext = sq + 1,您正在计算下一个数字,而不是下一个平方。

尝试这个:

import math 
def find_next_square(sq):
    # Return the next square if sq is a square, -1 otherwise
    if math.sqrt(sq).is_integer:
        sqnext = math.sqrt(sq) + 1
        return sqnext * sqnext
    else:
        return -1
        
print(find_next_square(121))    

编辑

看起来is_integer方法有缺陷,并且给出了亨利指出的错误值。下面的代码适用于达到一定限制的正整数。

import math
def find_next_square(sq):
    # Return the next square if sq is a square, -1 otherwise   
    if int(math.sqrt(sq))**2 == sq:
        sqnext = math.sqrt(sq)
        return sqnext * sqnext
    else:
        return -1

print(find_next_square(5))
print(find_next_square(121))

此外,由于sqrt不适用于负数,因此需要单独处理:

import math
def find_next_square(sq):
    # Return the next square if sq is a square, -1 otherwise
    sign = -1 if sq < 0 else 1

    if int(math.sqrt(abs(sq)))**2 == abs(sq):
        sqnext = math.sqrt(abs(sq)) + sign * 1
        return sqnext * sqnext * sign
    else:
        return -1
        
print(find_next_square(5))
print(find_next_square(121))
print(find_next_square(-9))

此外,由于溢出问题,上述所有方法都不适用于超出限制的大量数据。


推荐阅读