四平方和(穷举暴力破解)

四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多四个正整数的平方和。如果把 00 包括进去,就正好可以表示为四个数的平方和。

比如:

5=02+02+12+22

7=12+12+12+22

则对于一个给定的正整数 n,可以表示为:n = a^2 + b^2 + c^2 + d^2n=a2+b2+c2+d2

你需要求出 字典序 最小的一组解 a,b,c,d

字典序大小:从左到右依次比较,如果相同则比较下一项,直到有一项不同,较小的一方字典序更小,反之字典序更大,所有项均相同则二者字典序相同。

输入格式

程序输入为一个正整数N(1N5000000)。

输出格式

输出四个非负整数 a,b,c,d中间用空格分开。

样例输入1

5

样例输出1

0 0 1 2

样例输入2

12

样例输出2

0 2 2 2


提示:
其实我们只需要枚举 a,b,c 就可以了,因为 d 是可以通过 a,b,c的值计算出来的。这样我们就可以减少一层循环,从而降低程序运行时间,以避免运行超时。
三层循环加flag标志位

代码:

package 计蒜客;

import java.util.Scanner;

public class 四平方和 {

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int flag=0;                                                   //设置flag标志位
for(int i=0;i<=Math.sqrt(n);i++) {
if(flag==1) {
break;
}
for(int j=0;j<=Math.sqrt((n-i*i));j++) {
if(flag==1) {
break;
}
for(int k=0;k<=Math.sqrt(n-i*i-j*j);k++) {
int l=(int) Math.sqrt(n-i*i-j*j-k*k);
if(i*i+j*j+k*k+l*l==n) {
flag=1;
System.out.println(i+" "+j+" "+k+" "+l);
break;
}
}
}
}
}

}



posted @ 2018-01-29 17:06  henu小白  阅读(384)  评论(0编辑  收藏  举报