四平方和(穷举暴力破解)
四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多四个正整数的平方和。如果把 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(1≤N≤5000000)。
输出格式
输出四个非负整数 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;
}
}
}
}
}
}