日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Code pratice】—— 四平方和

發布時間:2024/1/1 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Code pratice】—— 四平方和 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Date:2022?10?06\color{FF6633}{Date:2022-10-06}Date2022?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. 最終結果是所有可能結果中聯合主鍵排序最小的。共同點都是升序排序,那么只要一開始就保證計算過程是按升序排序進行的,得到的第一個結果就是符合題目要求的,按照這個理解得到以下思路

  • 因為(0 <= a <= b <= c <= d),所以可以先求最大的位,這里先求C & D
    • 輪詢方式: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的區別:前者內部實現了哈希表,查找速度較快;后者內部實現了紅黑樹,具有自動排序的功能,這里主要用到查找,所以使用前者比較好
  • unordered_map<int, pair<int, int>> res; for (int c = 0; c^2 <= n; c++) {for (int d = c; c^2 + d^2 <= n; d++){int tmp = c^2 + d^2;if (0 == res.count(tmp)){res[tmp] = {c, d};}} }
  • 前面已經取得了c和d的所有可能組合結果,這里就只需要求a和b的所有可能結果即可,方法還是和上面一樣,不同的是
    • 結果判斷:經過前面的步驟,n、c、d三個值已經固定了,那么剩余變量a和b,只需要判斷n - a^2 - b^2 ?= c^2 + d^2即可,也就是判斷字典中是否存在n - a^2 - b^2值的組合
  • for (int a = 0; a^2 <= n; a++) {for (int b = a; a^2 + b^2 <= n; b++){int tmp = n - (a^2 + b^2);if (0 != res.count(tmp)){//輸出結果a, b, c, d}} }

    🥗代碼🥗

    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】—— 四平方和的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。