/*
【题目大意】
高精度乘法
【解题思路】
直接把1129制造出来的大数加法用过来:
1、多位数乘一位数,可以直接使用加法完成。
2、多位数乘形如d*10n的数,可以转换成多位数乘一位数来处理。
3、多位数乘多位数,可以转换为若干个“多位数乘形如d*10n的数与多位数乘一位数”之和。
因此,多位数乘多位数最终可以全部用加法来实现,专门另外写乘法什么的···何必如此想不开呢···
*/
/*
Run Time: 0secs
Run 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;
}
Sicily 1381. a*b
最新推荐文章于 2019-04-16 10:23:47 发布