题目十七:四平方和

目录

题目:

分析:

冒泡排序:

程序:


题目:

四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多 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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值