最后一个方法,通过数论先筛选一波,然后辗转遍历。比上一个快不少。最重要的是逻辑上比较锻炼数学能力。
前面两个方案就当练习吧,这个当做最终答案吧。 import math
def fun355(c):
def isSquareJiTop(num):
temp = math.floor(math.sqrt(num))
if temp * temp != num:
return False,2*((temp-1)//2)+1
else:
return True,0
def isSquareJiBottom(num):
temp = math.floor(math.sqrt(num))
if temp * temp != num:
return False,2*((temp+1)//2)+1
else:
return True,0
def isSquareOuTop(num):
temp = math.floor(math.sqrt(num))
if temp * temp != num:
return False,2*(temp//2)
else:
return True,0
def isSquareOuBottom(num):
temp = math.floor(math.sqrt(num))
if temp * temp != num:
return False,2*(temp//2)+2
else:
return True,0
res = c % 4
if res == 1:
a = 1
b = c
while a <= b:
arr = isSquareOuTop(c - a*a)
if arr[0]==True:
return True
else:
b = arr[1]
arr = isSquareJiBottom(c - b*b)
if arr[0] == True:
return True
else:
a = arr[1]
a = 0
b = c
while a <= b:
arr = isSquareJiTop(c - a*a)
if arr[0]==True:
return True
else:
b = arr[1]
arr = isSquareOuBottom(c - b*b)
if arr[0] == True:
return True
else:
a = arr[1]
elif res == 2:
a = 1
b = c
while a <= b:
arr = isSquareJiTop(c - a*a)
if arr[0]==True:
return True
else:
b = arr[1]
arr = isSquareJiBottom(c - b*b)
if arr[0] == True:
return True
else:
a = arr[1]
elif res == 0:
a = 0
b = c
while a <= b:
arr = isSquareOuTop(c - a*a)
if arr[0]==True:
return True
else:
b = arr[1]
arr = isSquareOuBottom(c - b*b)
if arr[0] == True:
return True
else:
a = arr[1]
return False
|