【Code pratice】—— 四平方和
Date:2022?10?06\color{FF6633}{Date:2022-10-06}Date:2022?10?06
Event\color{FF6633}{Event}Event is\color{FF6633}{is}is not\color{FF6633}{not}not the\color{FF6633}{the}the size\color{FF6633}{size}size of\color{FF6633}{of}of the\color{FF6633}{the}the power,\color{FF6633}{power,}power, and\color{FF6633}{and}and can\color{FF6633}{can}can insist\color{FF6633}{insist}insist on\color{FF6633}{on}on how\color{FF6633}{how}how long!\color{FF6633}{long!}long!
文章目錄
- 🍿1. 四平方和🍿
- 🥗題目🥗
- 🥗思路🥗
- 🥗代碼🥗
- 🥗總結🥗
🍿1. 四平方和🍿
🥗題目🥗
四平方和定理,又稱拉格朗日定理:每個正整數都可以表示為至多4個正整數的平方和(如果把0包括進去,剛好表示為4個正整數的平方和),對于一個給定的正整數,可能存在多種平方和的表示法,要求對四個數進行升序排序(0 <= a <= b <= c <= d),并對所有的可能表示法按a,b,c,d為聯合主鍵升序排序,最后輸出第一個表示法
如 數字5 有四種表示法 1. 5 = 0^2 + 0^2 + 1^2 + 2^2 2. 5 = 0^2 + 1^2 + 0^2 + 2^2 3. 5 = 0^2 + 2^2 + 0^2 + 1^2 4. 5 = 1^2 + 2^2 + 0^2 + 0^2 以上四種排序法中第一種已經按升序排序完成,所以輸出結果為第一組表示法🥗思路🥗
題目很好理解,看主要關鍵點,對所有的可能表示法按a,b,c,d為聯合主鍵升序排序,最后輸出第一個表示法,這里有兩個關鍵點:1. 結果必須是升序排序的;2. 最終結果是所有可能結果中聯合主鍵排序最小的。共同點都是升序排序,那么只要一開始就保證計算過程是按升序排序進行的,得到的第一個結果就是符合題目要求的,按照這個理解得到以下思路
- 輪詢方式:c <= d,所以大循環為c,小循環為d,循環的終止條件都是兩數平方和相加不大于給定的數n
- 結果存儲:因為要同時保存c和d兩個數字,而且c和d的組合有很多種,所以常規的數組什么的不太好進行后面的取值操作,這種情況字典就比較適配了,這里用STL中提供的unordered_map進行存儲(因為map可以存儲任意類型的數據,這里可以設置存儲類型為<int, pair<int,int>>,前者為c和d的平方和結果,后者為c和d兩者本身的值
- 結果判斷:如果當前c^2 + d^2 <= n,并且之前沒有記錄過,則保存下這組數字
- unordered_map & map的區別:前者內部實現了哈希表,查找速度較快;后者內部實現了紅黑樹,具有自動排序的功能,這里主要用到查找,所以使用前者比較好
- 結果判斷:經過前面的步驟,n、c、d三個值已經固定了,那么剩余變量a和b,只需要判斷n - a^2 - b^2 ?= c^2 + d^2即可,也就是判斷字典中是否存在n - a^2 - b^2值的組合
🥗代碼🥗
void LQ_Base::Pikashu_SumOf4Square(int i_uNum) {// 枚舉C & D,并存放于哈希表中unordered_map<int, pair<int, int>> res;for (int c = 0; (c * c) <= i_uNum; c++){for (int d = c; (d * d + c * c) <= i_uNum; d++){int tmp = d * d + c * c;if (0 == res.count(tmp)){res[tmp] = {c, d};}}}// 枚舉 A & Bfor(int a = 0; (a * a) <= i_uNum; a++){for (int b = a; (b * b + a * a) <= i_uNum; b++){int tmp = i_uNum - (b * b + a * a);if (0 != res.count(tmp)){cout << i_uNum << " = [" << a << "]^2 + [" << b << "]^2 + [" << res[tmp].first << "]^2 + [" << res[tmp].second << "]^2" << endl;return;}}}cout << "Can't find " << i_uNum << "'s sum of four square." << endl; }🥗總結🥗
以終為始,從最終結果反推解題步驟。既然要求都是升序排列,那么按升序輪詢求出的后兩個正整數,再按升序輪詢求出前兩個正整數,那么求出的第一組a^2 + b^2 + c^ + d^2 = n的結果就一定是題目所求的結果
總結
以上是生活随笔為你收集整理的【Code pratice】—— 四平方和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 您需要售后返修管理软件的N个理由
- 下一篇: 五年级上册计算机教学工作计划,人教版五年