目录
题目:
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多 4 个正整数的平方和。
如果把 0 包括进去,就正好可以表示为 4 个数的平方和。
比如:
5=0**2+0**2+1**2+2**2
7=1**2+1**2+1**2+2**2
对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对 4 个数排序:
0≤a≤b≤c≤d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法。
输入格式
输入一个正整数 N。
输出格式
输出4个非负整数,按从小到大排序,中间用空格分开。
数据范围
0<N<5∗10**6
输入样例:
5
输出样例:
0 0 1 2
分析:
四平方和,其实逻辑很简单,就是循环遍历数字,找到符合要求的数字即可。但需要注意的是:
1.为了应对时间复杂度的问题,这里采用空间换时间的策略,即先将a,b的数字的平方和找出来,再将c,d的数字的平方和找出来。
2.由于先将a与b的结果、c与d的结果单独保存起来,因此再对结果的处理上需要先提取出单独的a、b、c、d。
3.再对数字的排序上,采用的是冒泡排序。
冒泡排序:
冒泡的原理,我看着网上的原理解释的一大堆,其实我感觉冒泡就是相邻两位进行大小判断。
较大的一位直接永远位于较小的一位的后方。也就是一个简单的按位循环判断大小。
程序:
#针对该题的冒泡排序
def Maopao(num_list,All_list_key):
length = len(num_list)
print(length)
for i in range(length):
count = 0
for j in range(length-i-1):
if num_list[j]>num_list[j+1]:
num_list[j],num_list[j+1] = num_list[j+1],num_list[j]
count += 1
#这样处理的目的是,当数列的各位都排完之后,退出冒泡排序。
if count == 0:
break
#按题目要求处理输出结果
X = ''
for i in range(0,len(num_list)):
if len(X)>0:
X = X+str(' ')+str(num_list[i])
else:
X = X+str(num_list[i])
All_list_key.append(X)
print(num_list)
print(All_list_key)
print(All_list_key[0])
#预先找出第一个第二个数,以及第三个第四个数
C_D = {}
n = int(input('请输入一个正整数:'))
for i in range(1,n+1):
for j in range(1,n+1):
if i >= j:
C_D['{}{}'.format(j,i)] = i**2+j**2
else:
C_D['{}{}'.format(i,j)] = i ** 2 + j ** 2
A_B = {}
for i in range(0,n+1):
for j in range(0,n+1):
if i >= j:
A_B['{}{}'.format(j, i)] = i ** 2 + j ** 2
else:
A_B['{}{}'.format(i, j)] = i ** 2 + j ** 2
#寻找符合要求的四个数
Keys = []
list_key = []
All_list_key = []
for A_B_key,A_B_value in A_B.items():
for C_D_key,C_D_value in C_D.items():
if A_B_value+C_D_value == n:
Keys.append(A_B_key)
Keys.append(C_D_key)
print(Keys)
#分别提取A_B以及C_D的两个数里面的各个数字
for i in range(0,len(Keys),2):
list_key = []
for x in Keys[i]:
list_key.append(int(x))
for x1 in Keys[i+1]:
list_key.append(int(x1))
Maopao(list_key,All_list_key)
# print(Keys)