牛客网NC1大数加法

因为要计算的是两个很大很大的数,假设计算出来的数据大于整型的最大值,此时就会出现问题。所以要换个方法来解决问题。

我们应该以字符串的形式来读取两个正整数,并且返回二者相加的结果

我们应该从大数的个位开始,逐级的向上相加进位

下面我们来详细讲解一下大数加法的具体步骤:

1.假设两个字符串中有一个字符串为空,此时直接返回另外一个字符串

		if (s.empty())
		{
			return t;
		}
		if (t.empty())
		{
			return s;
		}

2.令更长的字符串为s,令短的字符串为t

		if (s.length() < t.length())
		{
			swap(s, t);
		}

3.先创建一个变量用来表示进位,取变量名字为carry,令它的默认值为0

		int carry = 0;

4.从后向前遍历长的字符串,并将它的每一个字符转换为数字并且加上进位,注意这里的个位不需要特殊处理,因为carry默认值是0,加上0不影响个位的结果:

		for (int i = s.length() - 1; i >= 0; i--)
		{
			int temp = s[i] - '0' + carry;

(注意这里 i 的数据类型不能是size_t,因为这样就会无限循环

5.因为两个字符串的长度可能是不同的,我们要从后向前提取短字符串的数据时,应该先要确定短字符串的下标

			int j = i - s.length() + t.length();

6.接下来我们需要对短字符串进行判断,如果短字符串此时没有处理完,就需要将短字符串当前数位上的字符转换为整型,并且与长字符串同数位上的数相加并取进位,如果相加的结果大于10还要去10

			if (j >= 0)
			{
				temp += t[j] - '0';
			}
			carry = temp / 10;
			temp = temp % 10;

7.最后我们需要对该数位上面的数进行修改:

			s[i] = temp + '0';
		}

8.结束循环以后我们需要对最后一次的进位进行处理,因为此时已经出了循环,最后一次进位没有处理

		if (carry == 1)
		{
			s = '1' + s;
		}

到这里,所有的代码就已经完成了,我们把代码整合一下:

class Solution
{
public:
	string solve(string s, string t)
	{
		if (s.empty())
		{
			return t;
		}
		if (t.empty())
		{
			return s;
		}

		if (s.length() < t.length())
		{
			swap(s, t);
		}

		int carry = 0;

		for (int i = s.length() - 1; i >= 0; i--)
		{
			int temp = s[i] - '0' + carry;
			int j = i - s.length() + t.length();
			if (j >= 0)
			{
				temp += t[j] - '0';
			}
			carry = temp / 10;
			temp = temp % 10;
			s[i] = temp + '0';
		}

		if (carry == 1)
		{
			s = '1' + s;
		}
		return s;

	}
};

我们来试着运行一下代码:

(还可以采取在短字符串前面补0的方法,这里就不做讲解了)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值