高精度乘高精度

对于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喷,我是小白)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值