第七屆藍橋杯javaB組真題解析-四平方和(第八題)


題目

 

/*
四平方和

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM