高精度整数加法_牛客题霸_牛客网 (nowcoder.com)
题目大意就是两个大整数相加
解决代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40#include <iostream> #include <string> #include <algorithm> using namespace std; string a, b; void input() { cin >> a >> b; } string ans = ""; void deal() { int aLen = a.length() - 1 , bLen = b.length() - 1; int carry = 0; while(aLen >= 0 || bLen >= 0){ char a1 = aLen >= 0 ? a[aLen--] : '0'; char b1 = bLen >= 0 ? b[bLen--] : '0'; int sum = (a1 - '0') + (b1 - '0') + carry; ans += (sum % 10 + '0') ; carry = sum / 10; } if(carry != 0){ ans += (carry + '0'); } } void output() { for(int i = ans.length() - 1 ; i >= 0 ; i --){ cout << ans[i]; } } int main() { input(); deal(); output(); }
代码解释
输入
以字符串
形式输入两个整数
处理函数——逐位相加
循环条件确定
我们需要对两个字符串循环处理,但是若是两个循环貌似就将多余了,之前有些想不明白应该怎么做
其实很简单,因为
- 两个条件都是需要满足
- 同时执行
所以,只需要在循环中用两个条件用 或
相连即可
复制代码
1
2while(n >= 0 || m >= 0)
这样就可以同时访问两个字符串,并且会在长度最长的字符串时终止循环
获取单个元素
因为在循环中,我们不清楚哪个长度长,因此需要利用三元表达式
进行判断获取值
并在处理时,对于长度不够的,进行 补零 处理。
复制代码
1
2
3int a1 = aLen >= 0 ? a[aLen--] : '0'; int b1 = bLen >= 0 ? b[bLen--] : '0';
代码中其实就包含了 抽象 的计算机思维,因为对于计算机来说,a和b本质上没有区别,仅仅只需要在它没有的时候,给零处理就行
当然,其实可以同样通过三元表达式确定最长的字符串
复制代码1
2string max = a.length() > b.length() ? a : b;
但是这将会 浪费空间 并且 其实我们没有必要知道哪个长,因为只需要对短的进行补零就行
逐位相加
在从字符串中获取单个字符之后,就可以将其转换为数字——通过- '0'
实现
并进行相加
这里需要注意的是,因为需要处理上一位相加的进位
因此,需要在相加时 ,加上进位的变量
因为在第一次相加时,是不可能产生进位的(因为没有上一位的运算),所以将表示进位的变量carry
设置初始值为0
而在后面的运算中,carry的值将会根据运算情况进行改变
复制代码
1
2int sum = (a1 - '0' ) + (b1 - '0') + carry;
判断溢出情况
在完成运算跳出循环时,很可能第一位的相加也产生进位,但是无法在循环中处理
因此,需要在循环外进行特殊处理
复制代码
1
2
3
4if(carry != 0){ ans += (carry + '0'); }
最后
以上就是魁梧鱼最近收集整理的关于高精读整数加法【循环总结】的全部内容,更多相关高精读整数加法【循环总结】内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复