大整数的乘法运算

思想:每次取第二个数的最高位进行一次乘法,把结果乘以10和下一次结果相加,题目来源:leetcode

class Solution {
public:
    //一个整数乘以一个个位数
    string multOneBit(string num,int data)
    {
    	int i = num.size() - 1,carry = 0;
    	string res;
    	for(;i >= 0;--i)
    	{
    		int value = (num[i] - '0') * data + carry;
    		carry = value / 10;
    		value = value % 10;
    		res += (value + '0');
    	}
    	if(carry > 0)res += (carry +'0');
    	reverse(res.begin(),res.end());
    	return res;
    }
    //两个大整数的加法
    string add(string s1,string s2)
    {
    	string res;
    	int i = s1.size() - 1,j = s2.size() - 1,carry = 0;
    	while(i >= 0 && j >= 0)
    	{
    		int value = s1[i--] + s2[j--] - '0' - '0' + carry;
    		carry = value / 10;
    		value = value % 10;
    		res += value + '0';
    	}
    	while(i >= 0)
    	{
    		int value = s1[i--] - '0' + carry;
    		carry = value / 10;
    		value = value % 10;
    		res += value + '0';
    	}
    	while(j >= 0)
    	{
    		int value = s2[j--] - '0' + carry;
    		carry = carry / 10;
    		value = value % 10;
    		res += value + '0';
    	}
    	if(carry > 0)res += (carry + '0');
    	reverse(res.begin(),res.end());
    	return res;
    }
    
    string multiply(string num1, string num2) {
    	int length2 = num2.size(),i;
    	string res;
    	for(i = 0;i < length2;++i)
    	{
    		string s = multOneBit(num1,num2[i] - '0');//每次取第二个数的最高位进行乘法算法
    		if(res.size() != 0)
    		{
    			res = add(res+'0',s);//把原来的结果扩大10倍加上当前的结果
    		}
    		else res = s;
    	}
    	if(res[0] == '0')res = '0';
    	return res;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值