本文主要是介绍牛客网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的方法,这里就不做讲解了)
这篇关于牛客网NC1大数加法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!