https://blog.csdn.net/qq_55364042/article/details/130098343?spm=1001.2014.3001.5502
与哈希相关的其他题目,可以去上面网址查看
题目要求:
任何一个数都能以用四个正整数数的平方的和表示,给定一个整数,得出四个数,这四个数的平方和为这个数
思维:
因为直接暴力的话需要四重循环,所以我们可以尝试,先用两重循环跑一半将结果保存在集合(hash),在跑另一半的时候将测试n-‘当前’ 是否在集合中,若在则成功。
代码实现:
import math
a=int(input())
N=int(math.sqrt(a))+1
check={}
for i in range(0,N):
for j in range(i,N):
if i*i+j*j>a:
break
if check.get(i*i+j*j)==None:
check[i*i+j*j]=(i,j)#只需要保留字典序最小的,又因为i<=j且从小到大遍历,所以第一个
#等于i*i+j*j的数就为最小字典序
t=False
for i in range(0,N):
for j in range(i,N):
if i*i+j*j>a:
break
t=a-i*i-j*j
if check.get(t)!=None:
print(i,j,check[t][0],check[t][1])####先求的肯定大,放后边,第二轮也是由小向大跑。
t=True
break
if t:
break