我是靠谱客的博主 魁梧鱼,这篇文章主要介绍高精读整数加法【循环总结】,现在分享给大家,希望可以做个参考。

高精度整数加法_牛客题霸_牛客网 (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
2
while(n >= 0 || m >= 0)

这样就可以同时访问两个字符串,并且会在长度最长的字符串时终止循环

获取单个元素

因为在循环中,我们不清楚哪个长度长,因此需要利用三元表达式进行判断获取值

并在处理时,对于长度不够的,进行 补零 处理。

复制代码
1
2
3
int a1 = aLen >= 0 ? a[aLen--] : '0'; int b1 = bLen >= 0 ? b[bLen--] : '0';

代码中其实就包含了 抽象 的计算机思维,因为对于计算机来说,a和b本质上没有区别,仅仅只需要在它没有的时候,给零处理就行

当然,其实可以同样通过三元表达式确定最长的字符串

复制代码
1
2
string max = a.length() > b.length() ? a : b;

但是这将会 浪费空间 并且 其实我们没有必要知道哪个长,因为只需要对短的进行补零就行

逐位相加

在从字符串中获取单个字符之后,就可以将其转换为数字——通过- '0'实现

并进行相加

这里需要注意的是,因为需要处理上一位相加的进位

因此,需要在相加时 ,加上进位的变量

因为在第一次相加时,是不可能产生进位的(因为没有上一位的运算),所以将表示进位的变量carry设置初始值为0

而在后面的运算中,carry的值将会根据运算情况进行改变

复制代码
1
2
int sum = (a1 - '0' ) + (b1 - '0') + carry;

判断溢出情况

在完成运算跳出循环时,很可能第一位的相加也产生进位,但是无法在循环中处理

因此,需要在循环外进行特殊处理

复制代码
1
2
3
4
if(carry != 0){ ans += (carry + '0'); }

最后

以上就是魁梧鱼最近收集整理的关于高精读整数加法【循环总结】的全部内容,更多相关高精读整数加法【循环总结】内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(80)

评论列表共有 0 条评论

立即
投稿
返回
顶部