2、大數據相乘
問題描述
有兩個用字符串表示的非常大的大整數,算出他們的乘積,也是用字符串表示。不能用系統自帶的大整數類型。
輸入描述:
空格分隔的兩個字符串,代表輸入的兩個大整數
輸出描述:
輸入的乘積,用字符串表
問題分析
感覺有點坑,在編譯器上可以通過,牛客上通不過,還有這道題沒有考慮很多問題,比如說符號問題,輸入非法情況,
所以,以後編程題,先做出來,再考慮其他問題。
大數據相乘,就是字符串相乘,有兩種普通的方法,移位進位法和逐位相乘法。
代碼實現
(1)移位進位法
移位進位法,大體上就是普通人正常計算乘法的思維。
//移位進位法
string Mul(string left, string right)
{
size_t Lsize = left.size();
size_t Rsize = right.size();
size_t Size = Lsize + Rsize;
string res(Size, '0');
int takevoer = 0;//進位
int offset = 0;//移位
size_t idx = 1, j = 1;
for ( idx = 1; idx <= Rsize; ++idx)
{
takevoer = 0;
int rightnum = right[Rsize - idx] - '0';
//計算每一位與left相乘
for ( j = 1; j <= Lsize; ++j)
{
char resBit = res[Size - j - offset] - '0';
int num = rightnum * (left[Lsize - j] - '0') + takevoer + resBit;
takevoer = num / 10;
res[Size - j - offset] = num % 10 + '0';
}
if (takevoer != 0)
res[Size - j - offset] = takevoer + '0';
offset++;
}
//如果沒有進位的話,res最高位沒有數字
if (res[0] == '0')
res.erase(0,1);
return res;
}
2、逐位相乘法
這個方法是,把計算的結果不考慮進位都保存到一個數組中,
然後在考慮進位。
//逐位相乘法
//將計算的整體結果保存res中,然後再考慮進位
string Mul2(string left,string right)
{
size_t lSize = left.size();
size_t Rsize = right.size();
size_t Size = lSize + Rsize;
vector<int> res(Size, 0);
/*int *res = new int[Size];
memset(res, 0, sizeof(int)* Size);*/
for (size_t i = 0; i < Rsize; ++i)
{
int rightnum = right[Rsize - i - 1] - '0';
for (size_t j = 0; j < lSize; ++j)
{
int num = rightnum * (left[lSize - j - 1] - '0');
//逆序存放
res[Size - 1 -(i + j)] += num;
}
}
//處理進位
int takeover = 0;
size_t idx = 0;
for (; idx < Size; ++idx)
{
int temp = res[Size - idx - 1] + takeover;
res[Size - idx - 1] = temp % 10;
takeover = temp / 10;
}
//進位沒有處理完
while (takeover != 0)
{
res[Size - idx - 1] = takeover % 10 ;
takeover /= 10;
}
//處理返回結果
string result;
for (size_t index = 0; index < Size; ++index)
{
result += res[index] + '0';
}
//如果沒有進位的話,res最高位沒有數字
if (result[0] == 0)
result.erase(0, 1);
return result;
}
int main()
{
string data;
getline(cin, data);
size_t pos = data.find(' ');
string left = data.substr(0, pos);
string right = data.substr(pos + 1);
string res = Mul2(left, right);
cout << res << endl;
system("pause");
return 0;
}