|
发表于 2020-3-19 23:47:23
|
显示全部楼层
最后一个方法,通过数论先筛选一波,然后辗转遍历。比上一个快不少。最重要的是逻辑上比较锻炼数学能力。
前面两个方案就当练习吧,这个当做最终答案吧。
- 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
复制代码 |
评分
-
查看全部评分
|