四平方和(暴力破解)

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

比如:

 

5=02+02+12+22\displaystyle 5 = 0^2 + 0^2 + 1^2 + 2^25=02+02+12+22

 

 

7=12+12+12+22\displaystyle 7 = 1^2 + 1^2 + 1^2 + 2^27=12+12+12+22

 

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

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

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

输入格式

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

输出格式

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

样例输入1

5

样例输出1

0 0 1 2

样例输入2

12

样例输出2

0 2 2 2
package 计蒜客;

import java.util.Scanner;

public class 四平方和 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scan=new Scanner(System.in);
        int n=scan.nextInt();
        outer:for(int a=0;a<=Math.sqrt(n);a++){
            for(int b=0;b<=Math.sqrt(n-b*b);b++){
                if(a*a+b*b>n){break;}
                for(int c=0;c<=Math.sqrt(n-a*a-b*b);c++){
                    int d=(int) Math.sqrt(n-a*a-b*b-c*c);
                    if(a*a+b*b+c*c+d*d==n){
                        System.out.println(a+" "+b+" "+c+" "+d);
                        break outer;
                    }
//                    if(a*a+b*b+c*c>n){
//                        break;
//                    }
//                    for(int d=0;d<=Math.sqrt(n-a*a-b*b-c*c);d++){
//                        if(a*a+b*b+c*c+d*d>n){
//                            break;
//                        }
//                        if(a*a+b*b+c*c+d*d==n){
//                            System.out.println(a+" "+b+" "+c+" "+d);
//                            break outer;
//                        }
//                    }
                }
            }
        }
    }

}

 

posted @ 2018-03-13 19:09  henu小白  阅读(262)  评论(0编辑  收藏  举报