題目
/* 四平方和 四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多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,否則按無效代碼處理。 */
代碼 (自己寫的代碼可能會有錯的地方,請大家見諒)
1 import java.util.*; 2 public class Main { 3 public static void main(String[] args) { 4 int s = (new Scanner(System.in)).nextInt(); 5 int a,b,c,d; 6 for(a=0;a<=Math.sqrt(s);a++) { 7 for(b=a;b<=Math.sqrt(s);b++) { 8 for(c=b;c<=Math.sqrt(s);c++) { 9 for(d=c;d<=Math.sqrt(s);d++) { 10 if(s == (Math.pow(a, 2) + Math.pow(b, 2) + Math.pow(c, 2) + Math.pow(d, 2))){ 11 System.out.println(a+" "+b+" "+c+" "+d); 12 return; 13 } 14 } 15 } 16 } 17 } 18 } 19 }
解析
也是一個類似排列組合的題目,也可能是我只會這一種方法吧,每個題都往這方面想 :),算法大題的題目一般很長,要學會找出有用的點來,沒想到這個題目這么簡單,畢竟是30分的題,也可能是我的算法有錯誤,沒有可以檢驗的地方,無奈
說思路: 因為題目要求4個數從小到大並且取最小的一項輸出,所以用四個for循環來表示四個數,並且內層的循環變量起始值=外層變量,來確保有順序,這樣寫還有一個好處,當選取出第一個項時,這個結果就是最小的結果項,此時就可以return了 :)