藍橋杯 第七屆省賽試題 四平方和
阿新 • • 發佈:2018-12-30
四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多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 com.diqijie.shengsai; import java.util.Scanner; /** * @author leibaobao * 四平方和 * 解:哎,這題我超級無語。不多說了,這題做對了估計有100分以上吧 * 我居然想成動態規劃還浪費了很長時間,錯了555555 * 想辦法去掉一個迴圈這題滿分 */ public class _8 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan = new Scanner(System.in); int N = scan.nextInt(); long time = System.currentTimeMillis(); int max = (int)Math.sqrt(5000000); out: for(int a = 0; a <= max; a++) for(int b = a ; b <= max; b++) for(int c = b; c <= max; c++){ int d = (int) Math.sqrt(N - a*a - b*b - c*c); if(N == a*a + b*b + c*c + d*d){ System.out.println(a + " " + b + " " + c + " " + d); break out; } } long time1 = System.currentTimeMillis(); System.out.println(time1-time); } }