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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

大数相乘(c语言/c++)

發布時間:2025/3/19 c/c++ 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大数相乘(c语言/c++) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大數相乘(c語言/c++)

  • 方法一:做加法
  • 方法二、做乘法

方法一:做加法

思路:模擬豎乘過程。將num2從后往前一個一個的去乘num1.然后累加。在累加的時候記得在末尾補0.補的0的個數就是第二個字符串中當前i與長度-1的距離。

代碼:

string multiply(string num1, string num2) {if(num1=="0"||num2=="0") //其中有一個為0就直接返回0了return "0";string ans = "0";int n = num1.size(), m = num2.size();for(int i=m-1;i>=0;--i) //遍歷字符串2中的每一位{string cur; //用來記錄當前字符乘num1所得的字符串int add = 0; //進位for (int j = m - 1; j > i; j--) { cur.push_back(0); // 末尾補上0}int y = num2.at(i) - '0'; //轉化為整數for(int j=n-1;j>=0;--j){int x = num1.at(j) - '0';int product = x * y + add; //相乘結果cur.push_back(product%10); //取余add = product/10; //進位}if(add!=0) //不等于0表明在相乘后位數加1了{ cur.push_back(add%10);add /=10;}reverse(cur.begin(),cur.end());//轉過來,因為之前是個位數在前for(auto &ch:cur) //轉化為字符串,&表示引用ch += '0';ans = addStrings(ans,cur); //累加}return ans; } // 大數相加string addStrings(string &num1, string &num2) {int i = num1.size() - 1, j = num2.size() - 1, add = 0;string ans;while (i >= 0 || j >= 0 || add != 0) {int x = i >= 0 ? num1.at(i) - '0' : 0;int y = j >= 0 ? num2.at(j) - '0' : 0;int result = x + y + add;ans.push_back(result % 10);add = result / 10;i--;j--;}reverse(ans.begin(), ans.end());for (auto &c: ans) {c += '0';}return ans;}

大數相加可以加這邊博文解釋:
大數相加

方法二、做乘法

明確兩點:

  • 令 m 和 n 分別表示num1和num2的長度,并且它們均不為 0,則 num 1
    和 num2的乘積的長度為m+n?1 m+n。
  • 對于任意 0≤i<m 和 0≤j<n,num [i]×num 2[j] 的結果位于ansArr[i+j+1]。
  • 代碼:

    string multiply(string num1, string num2) {int n = num1.size(),m = num2.size();if(num1=="0"||num2=="0")return "0";vector<int>ans(m+n,0);for(int i=m-1;i>=0;--i){int y = num2[i] - '0';for(int j=n-1;j>=0;--j){int x = num1[j] - '0';ans[i+j+1] +=x*y; //將相乘結果放到數組中}}//進位,按上面的,位數高的是在數組前邊,所以從后邊開始進位for(int i=n+m-1;i>0;i--){// 這里也可以不用判斷,因為如果不大于10的話/10 得到的是0if(ans[i]>=10) //大于10的話,往前進位{ans[i-1] +=ans[i]/10;ans[i] %=10;}}//看第一位是否大于0,判斷字符起始的位置int index = ans[0] >0?0:1;string res;for(int i=index;i<n+m;++i)res.push_back(ans[i]+'0');return res;}

    總結

    以上是生活随笔為你收集整理的大数相乘(c语言/c++)的全部內容,希望文章能夠幫你解決所遇到的問題。

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