大数乘法

给定两个字符串,对其求积。原理:对于乘数和被乘数,例如9*9,计算的结果位数最多为2位,也就是说,任意一个数,乘以9,结果最多增加1位,所以,对于i位乘数和j位被乘数,所得到的结果最多为i+j位。在结果中,第i+j位的值为乘数中第i位乘以被乘数第j位和乘数第j位乘以被乘数第i位的值的和。但根据遍历可知,若初始化结果数组大小为i+j个数,最大遍历数只能到i+j-1,最后一位永远是0,所以初始化为i+j-1个数,若结果为i+j位,我们就对最高位即result[0]的数值不进行进位处理,得到的就是期望的乘积值。
在后期处理中,因为结果中的极有可能是大于9的,所以要进行向高位进位处理。
代码如下:

void main()
{
    string value1,value2;
    cin>>value1>>value2;//输入数字,第0为为最高位
    int size1 = value1.size();
    int size2 = value2.size();
    int size =size1 +size2-1;
    vector<int> result(size,0);//保存结果
    for(int i = 0;i <  size1;++i)
    {
        for(int j = 0;j < size2;++j)
        {
            result[i+j] += (value1[i]-'0') * (value2[j]-'0');

        }
    }
    for(int i = size-1;i>0;--i) //进位处理,第0位为最高位,所以即便大于10也可以不用处理,输出时结果是一样的
    {
            result[i-1] +=result[i]/10;
            result[i] %= 10;
    }
    int no_zero = size-1;
    while(result[no_zero] == 0)
    {
        --no_zero;
    }

    for(int i = 0;i < size;++i)
    {
         cout<<result[i];
    }
    system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值