Sicily 1381. a*b
来源:互联网 发布:知耻近乎后勇 编辑:程序博客网 时间:2024/05/16 02:58
/*【题目大意】高精度乘法 【解题思路】直接把1129制造出来的大数加法用过来:1、多位数乘一位数,可以直接使用加法完成。2、多位数乘形如d*10n的数,可以转换成多位数乘一位数来处理。3、多位数乘多位数,可以转换为若干个“多位数乘形如d*10n的数与多位数乘一位数”之和。因此,多位数乘多位数最终可以全部用加法来实现,专门另外写乘法什么的···何必如此想不开呢··· *//*Run Time: 0secsRun Memory: 312KB*/#include <iostream>#include <string>using namespace std;string numA, numB;//字符串逆序 inline string changeBack(const string& num){ char buf[num.length()+1]; for(int i=0; i<num.length(); i++) buf[i] = num[num.length()-i-1]; buf[num.length()] = '\0'; return buf;} //大数加法(反序) inline string Add(string a, string b){ //调节为a长b短 if(a.length() < b.length()){ string buf = a; a = b; b = buf; } //补零 a += '0'; while(a.length()-b.length() != 0) b += '0'; int add = 0; string result = ""; for(int i=0; i<b.length(); i++){ int buf = add + (a[i]-'0') + (b[i]-'0'); if(buf/10 == 1) add = 1; else add = 0; result += (buf%10) + '0'; } if(result[result.length()-1] == '0') return result.substr(0, result.length()-1); else return result; }//乘法由加法组成 string Mult(string a, string b){ a = changeBack(a); b = changeBack(b); //调节成a长b短 if(a.length() < b.length()){ string buf = a; a = b; b = buf; } //一位数乘以多位数,其实就是多位数加num次 string temp[b.length()]; //存放中间值 for(int i=0; i<b.length(); i++){ int num = b[i] - '0'; string buf = "0"; for(int j=0; j<num; j++) buf = Add(a, buf); temp[i] = buf; } //将不同位数加起来 string result = "0"; for(int i=0; i<b.length(); i++){ string buf = temp[i]; for(int j=0; j<i; j++) buf = '0' + buf; result = Add(buf, result); } return changeBack(result);} int main(){ int T; cin >> T; while (T-->0){ cin >> numA >> numB; cout << Mult(numA, numB) << endl; } return 0;}