写在前面:
在处理某些大数问题,尤其很多时候我们无法使用int,long long等类型来存储时,我们会考虑使用大数算法,也就是高精度算法,来扩大我们数据的存储量级。本篇文章我们就浅谈一下高精度算法中的加法和乘法问题。
经过一段时间的c++学习后,我们会发现各种数据类型的优缺点,比如string类型适合存储很大的数据,但不适合直接进行数值运算,而int类型数组适合来进行数值运算。
因此在高精度算法中,我们常见思路为:用string类型来输入数据,再将string类型转换为int类型的数组中进行运算。
具体形式如下:
高精度加法:
string addfunc(string a, string b)
{
int arra[250], arrb[250];
memset(arra, 0, sizeof(arra));
memset(arrb, 0, sizeof(arrb));
arra[0] = a.length();
arrb[0] = b.length();
for (int i = 1; i <= arra[0]; i++)
{
arra[i] = a[arra[0] - i]-'0';
}
for (int i = 1; i <= arrb[0]; i++)
{
arrb[i] = b[arrb[0] - i]-'0';
}
int len = max(arra[0], arrb[0]);
for (int i = 1; i <= len; i++)
{
arra[i] += arrb[i];
arra[i + 1] += arra[i] / 10;
arra[i] %= 10;
}
if (arra[len + 1] != 0)
len++;
string ans="";
for (int i = len; i >= 1; i--)
{
ans += to_string(arra[i]);
}
return ans;
}
高精度乘法:
string funcmultiply(string a, string b)
{
int arra[250], arrb[250];
memset(arra, 0, sizeof(arra));
memset(arrb, 0, sizeof(arrb));
int ans[500];
memset(ans, 0, sizeof(ans));
arra[0] = a.length();
arrb[0] = b.length();
for (int i = 1; i <= arra[0]; i++)
{
arra[i] = a[arra[0] - i]-'0';
}
for (int i = 1; i <= arrb[0]; i++)
{
arrb[i] = b[arrb[0] - i]-'0';
}
int len = arra[0] + arrb[0] - 1;//最少为len位,但有可能会是len+1
for (int i = 1; i <= arra[0]; i++)
{
for (int j = 1; j <= arrb[0]; j++)
{
ans[i + j - 1] += arra[i] * arrb[j];
ans[i + j] += ans[i + j - 1] / 10;
ans[i + j - 1] %= 10;
}
}
if (ans[len + 1] != 0)
len++;
string str;
for (int i = len; i >= 1; i--)
{
str += to_string(ans[i]);
}
return str;
}