对于c/c++而言,数据到达一定位数以后会出现乱码的情况,因此高精度的出现则很好的解决了这类问题,今天我想在这里分享一下高精度相乘
对高精度来说,最初储存数据的不再是int型变量,而是用字符串储存
一、读入两个数
string s1,s2;
cin >> s1 >> s2;
对于字符串来说,做加减乘除是很难操作的,因此我们就需要三个int型数组帮助我们。
二、逆序转存进int型数组中
int num1[521],num2[521],num[1314];
int lens1 = s1.length();
for(int i = 0; i < lens1 ; i++)
{
num1[i] = s1[lens1-1-i] - '0';
}
//对于num2[521]的操作与上面方式一样,这里就不过多赘述。
三、逐位相乘,同时处理进位
for(int i = 0; i < lens1; i++)
{
for(int j = 0; j < lens2 ;j++)
{
//这里需要注意了,我们需要定义一个k,用来代表num3[1314]的下标,这个是因为
//乘了以后它所对的位置是i+j的位置
int k = i + j;
num3[k] += num1[i] * num2[j];
//处理进位
if(num3[k] >= 10)
{
num3[k+1]+=num3[k]/10;
num3[k] %= 10;
}
}
}
四、判断整体位数是否增加
这一步操作相当于检测一下新数组的长度,便于我们后面进行输出等等
int len = lens1 + lens2;
while(num3[len]!=0)
{
len++;
}
其实最后会发现,如果len > lens1 + lens2执行上面代码后,len是会多1的,但是我们可以不用在意,因为下面这一步操作刚好解决了这个问题
五、删除前面的0
while(num3[len] == 0 && len > 1)
len--
六、逆序输出结果
for(int i=len - 1; i>=0 ; i--)
{
cout<<num3[i];
}
就此高精度相乘就这样结束了。(大佬wu喷,我是小白)