蓝桥杯-四平方和

四平方和

四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多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 (N<5000000)
要求输出4个非负整数,按从小到大排序,中间用空格分开

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
例如,输入:
5
则程序应该输出:
0 0 1 2

再例如,输入:
12
则程序应该输出:
0 2 2 2

再例如,输入:
773535
则程序应该输出:
1 1 267 838
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
资源约定:
峰值内存消耗 < 256M

CPU消耗  < 3000ms

______________________________________________________________________________________________________

/*
由于这里 N<5000000 ,所以要进行一般的时间复杂度优化。
一般算法时间上慢是因为 执行了太多不必要的语句情况。所以,
一个方法是可以用一些条件去掉一些情况。比如这里 if(i*i+j*j>n)break;
i 和 j 后面是增大的所以后面情况必然不能满足 平方和==n。
这个改进后我算的平均优化了 2*2*2*2=16;然后因为比如1 1 2 2和
2 2 1 1 是同一种情况,所以在循环的时候,j=i 开始循环。这样改进后,
又优化了 2。所以总共是 16*2=32。
所以,最坏时间复杂度是 n^3,这里最差情况大概是 10^10.
  (我分析的很可能错误,如果您有想说的想法,欢迎在下方留言评论 ^_^) 
*/
#include<iostream>
#include<cmath>
using namespace std;
int n;
int a,b,c,d;
void h(){
int nn=sqrt(n)+1;
for(int i=0;i<=nn;i++){
for(int j=i;j<=nn;j++){
if(i*i+j*j>n)break;
for(int k=j;k<=nn;k++){
if(i*i+j*j+k*k>n)break;
for(int l=k;l<=nn;l++){
if(i*i+j*j+k*k+l*l>n)break;
int sum=i*i+j*j+k*k+l*l;
if(n==sum){
a=i;b=j;c=k;d=l;
return; 
}
}
}
}
}
}
int main(){
scanf("%d",&n);
h();
cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值