四平方和(蓝桥杯真题)

四平方和

四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多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个非负整数,按从小到大排序,中间用空格分开
第一种解法:
暴力枚举出每一个数

#include
#include 
int main(){
	long n;
	scanf("%d",&n);
	for(long a=0;a*a<n/4;a++){
		for(long b=a;b*b<n/3;b++){
			for(long c=b;c*c<n/2;c++){
				for(long d=c;d*d<n;d++){
					if((a*a+b*b+c*c+d*d)==n){
						printf("%d %d %d %d\n",a,b,c,d);
						return 0;
					}
				}
			}
		}
	} 
	return 0;
}

第二种解法:
将cc+dd的所有可能结果都放到集合中,然后用n-aa+bb算出来到集合中找有没有对应的解,有的话输出

小数字可以算,大数字会有偏差,留在这希望有大佬可以指正!!!

#include
#include
#include
using namespace std;
map<int,int>mp; 
int main(){
	int n;
	scanf("%d",&n);
	for(int c=0;c*c<n;c++){
		for(int d=c;c*c+d*d<n;d++){
			if(!mp.count(c*c+d*d))
			mp[c*c+d*d]=c;
		}
	}
	for(int a=0;a*a<n/4;a++){
		for(int b=a;a*a+b*b<n/2;b++){
			if(mp.count(n-a*a-b*b)){
			    int c=mp[n-a*a-b*b];
			    int d=(int)sqrt(n-a*a-b*b-c*c);
			    printf("%d %d %d %d",a,b,c,d);
			    return 0;
			}
		}
	}
	return 0;
}

四平方和(蓝桥杯真题)_第1张图片

你可能感兴趣的:(蓝桥杯)