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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【Code pratice】—— 大数乘法

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

Date:2022?10?07\color{33CCFF}{Date:2022-10-07}Date2022?10?07

Last\color{33CCFF}{Last}Last night\color{33CCFF}{night}night a\color{33CCFF}{a}a few\color{33CCFF}{few}few extra\color{33CCFF}{extra}extra minutes\color{33CCFF}{minutes}minutes preparation,\color{33CCFF}{preparation,}preparation, fewer\color{33CCFF}{fewer}fewer hours\color{33CCFF}{hours}hours of\color{33CCFF}{of}of trouble\color{33CCFF}{trouble}trouble today!\color{33CCFF}{today!}today!

文章目錄

  • 🥠1. 大數乘法🥠
    • 🍖題目🍖
    • 🍖思路🍖
    • 🍖代碼🍖

🥠1. 大數乘法🥠

🍖題目🍖

對于32位字長的機器,大約超過20億,用int類型無法表示,我們可以選擇int64類型,但無論怎么擴展,固定的整數類型總有表達的極限!如果對超級大整數進行精確運算呢?一個簡單的方法就是:僅僅使用現有的類型,但是把大整數的運算化為若干個小證書的運算,即所謂:“分塊法”,原理如下圖

🍖思路🍖

本題關鍵在于理解分塊乘法的原理,原理中的分塊很好理解,乘法也很好理解,難理解的是進位

  • 分塊:按照圖中的x1, x2, y1, y2對數字進行取值即可
  • 乘法:按照圖中的m1, m2, m3, m4對數字進行相乘即可
  • 結果:圖中的r1, r2, r3, r4,并不是簡單的r1 = m4, r2 = m2 + m3 + m4, r3 = m1 + m2 + m3, r4 = m1的相加,因為m1 ~ m4這四個值是通過x1, x2, y1, y2組合相乘得來的,而x1, x2, y1, y2又是通過原有數值進行分塊而來,所以這個相加并不簡單。不簡單在于這里需要回歸 + 進位,可以注意到圖中有每一個mn都有兩個,為什么?因為它們對應分塊時的前段和后段,所以rn的取值應該先回歸,然后還需要對每一部分的結果進行進位
    • 回歸:如果當前結果是由前段分塊乘積得來,那么結果也要對應的回歸到前段的隊伍中,反之亦然
    • 進位:就是熟知的加法運算中的進位,如滿10進1等
  • 舉個例子
    X = 23, Y= 34, 分兩段,以10為界

  • 分塊
    • x1 = X % 10 = 3, x2 = X / 10 = 2
    • y1 = Y % 10 = 4, y2 = Y / 10 = 3
  • 乘法
    • m1 = x1 * y1 = 12;
    • m2 = x2 * y1 = 8;
    • m3 = x1 * y2 = 9;
    • m4 = x2 * y2 = 6;
  • 結果
    • 回歸
    • r1 = m4(前段) = 6 / 10 = 0;
    • r2 = m2(前段) + m3(前段) + m4(后段) = 8 / 10 + 9 / 10 + 6 % 10 = 6;
    • r3 = m1(前段) + m2(后段) + m3(后段) = 12 / 10 + 8 % 10 + 9 % 10 = 18;
    • r4 = m1(后段) = 12 % 10 = 2;
    • 進位
    • r4:通過后段獲取,本身就是相當于個位數,不需要進位
    • r3:將大于后段范圍(前段值)的部分進位到r2,自身保留后段
      r2 = r2 + r3 / 10 = 6 + 1 = 7
      r3 = r3 % 10 = 18 % 10 = 8
    • r2:將大于后段范圍(前段值)的部分進位到r1,自身保留后段
      r1 = r1 + r2 / 10 = 0 + 6 / 10 = 0
      r2 = r2 % 10 = 6 % 10 = 6
    • r1:通過前段獲取,本身相當于最大位,與后面進位上來的結果值相加即可
    • 最后結果為r1r2r3r4 = 0782
  • 🍖代碼🍖

    void MultiLargeNumbers(int i_uXnum, int i_uYnum, int i_uBase) {vector<int> res(4, 0);/* 1. 獲取各部分小數 */int x1 = i_uXnum % i_uBase;int x2 = i_uXnum / i_uBase;int y1 = i_uYnum % i_uBase;int y2 = i_uYnum / i_uBase;/* 2. 獲取m1, m2, m3, m4 的值 */int m1 = x1 * y1;int m2 = x2 * y1;int m3 = x1 * y2;int m4 = x2 * y2;/* 3. 保存r1, r2, r3, r4 的初步結果 */res[0] = m4 / i_uBase;res[1] = m2 / i_uBase + m3 / i_uBase + m4 % i_uBase;res[2] = m1 / i_uBase + m2 % i_uBase + m3 % i_uBase;res[3] = m1 % i_uBase;/* 4. 根據乘積,進行進位處理 */res[1] += res[2] / i_uBase;res[2] %= i_uBase;res[0] += res[1] / i_uBase;res[1] %= i_uBase;/* 5. 輸出最后結果 */cout << "Final result = [" << res[0] << res[1] << res[2] << res[3] << "]" << endl; }

    總結

    以上是生活随笔為你收集整理的【Code pratice】—— 大数乘法的全部內容,希望文章能夠幫你解決所遇到的問題。

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