1. 程式人生 > >四平方和

四平方和

AR sys time 函數 表示 個數 文件中 重要 for

四平方和定理,又稱為拉格朗日定理:
每個正整數都可以表示為至多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


請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。

所有代碼放在同一個源文件中,調試通過後,拷貝提交該源碼。
註意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
註意:主類的名字必須是:Main,否則按無效代碼處理。

package 藍橋杯;

import java.util.Scanner;

public class 四平方和 {
      public
static void main(String[] args){ Scanner sc=new Scanner(System.in); int N=sc.nextInt(); long time=System.currentTimeMillis();//時間的計算,幫助你查看時間 int t; int max=(int)Math.sqrt(5000000);//開根號函數。此函數書寫時一定要見Math!以及就是將其強制轉換。 out://因為藍橋杯中有許多瞎暴力,所以這個out: break out組合就可以幫你一次就跳出多級循環。十分重要。
for(int i=0;i<max;i++){ for(int j=i;j<max;j++){ for(int k=j;k<max;k++){ t=(int) Math.sqrt(N-(i*i+j*j+k*k)); if(N==i*i+j*j+k*k+t*t) { System.out.println(i+" "+j+" "+k+" "+t); break out; } } } } long time1=System.currentTimeMillis(); System.out.println(time1-time); } }

這題解法不難,就是暴力。但是要註意一個問題:如果用四層循環的話就會超時,所以要想辦法去掉一層循環。做法是:先暴力出三個數,然後用N減掉這三個數後開根號。然後再用等式判斷這個數是不是第四個數。(int型強制轉換後會變化)。

四平方和