大数相乘(c语言/c++)
生活随笔
收集整理的這篇文章主要介紹了
大数相乘(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;}大數相加可以加這邊博文解釋:
大數相加
方法二、做乘法
明確兩點:
和 num2的乘積的長度為m+n?1 m+n。
代碼:
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++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 划分字母区间(双指针,贪心)
- 下一篇: c++ 判断数学表达式有效性_高考数学大