大意:用string 類型的兩個大數進行相乘,輸出結果
輸入:樣例一:-11 -11
樣例二:-15116516166564654646456456454655 121231312313214984894961116
輸出:樣例一:121
樣例二:-1832595092476562998391796185384824031048718264583442194980
思路:純粹地模擬手動計算兩個數相乘的過程即:
- 判斷是否帶負號,帶負號則取出數值部分
- 以一個字符串的每一位去乘另一個字符串的每一,並用一個字符串保存結果
- 補齊第二步中得到字符串的低位,補充相應個數個0
- 將第三步中得到所有字符串進行相加
- 輸出負號及第四步中得到的數值結果
#include <iostream> #include <string> using namespace std; string max_i,min_i; string count_add(string s1,string s2) //進行兩個數相加 { max_i = s1;min_i = s2; if(s2.size()>s1.size()) { max_i = s2; //取長度大的數為max min_i = s1; } for(int i = min_i.size()-1,j = max_i.size()-1; i>=0;i--,j--) //模擬整數加的過程 { max_i[j] += min_i[i] -'0'; //選擇將結果保存在max變量中 if(max_i[j] > '9') //字符值大於9需要處理 { if(j > 0) { max_i[j - 1] ++; max_i[j] -= 10; } else { max_i = "1" + max_i; max_i[j] -= 10; } } } return max_i; } int main() { string s1,s2; cin>>s1>>s2; int i,j; bool nega_s1 = false,nega_s2 = false; if(s1[0] == '-') //若帶負號,則取出數字部分 { nega_s1 = true; s1 = s1.substr(1); //將第一位開始的部分重新賦給s } if(s2[0] == '-') { nega_s2 = true; s2 = s2.substr(1); } char unit, decade = '0'; int a,b; string result_one[s2.size()]; //保存中間的s2的每一位乘s1的結果 for(i = s2.size()-1; i >= 0; i--) //模擬相乘過程 { a = s2[i] - '0'; for(j = s1.size()-1; j >= 0; j--) { b = s1[j] - '0'; unit =((a * b) + decade - '0') % 10 + '0' ; //保存兩個數字相乘的個位、十位 decade = ((a * b) + decade - '0') / 10 + '0'; result_one[s2.size() -1- i] = unit + result_one[s2.size() -1- i] ; } if(decade != '0') result_one[s2.size() -1- i] = decade + result_one[s2.size() -1- i]; decade = '0'; } for(i = 0; i < s2.size(); i++) //對中間結果補齊位數 { for(j = i;j > 0; j--) { result_one[i] = result_one[i] + '0'; } } string sum = "0"; //用sum變量保存最終結果 for(i = 0;i < s2.size(); i++) { sum = count_add(sum,result_one[i]); //相加 } int tip = 0; for(i = 0; i < sum.size(); i++) //找出非零的起始位置 { if(sum[i] == '0' ) { tip ++; } else break; } if(nega_s1 + nega_s2 == 1) //輸出符號 cout<<"-"; for(i = tip ; i < sum.size(); i++) //輸出數字部分答案 { cout<<sum[i]; } if(tip == sum.size()) cout<<"0"; return 0; }
補充:輸出進行了一定處理,防止輸出0001這樣的結果(即不輸出數字開始的0)
運行截圖如下
再試試真正的大數相乘