题目大意就是两个大整数相加
#include
#include
#include
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();
}
以字符串
形式输入两个整数
循环条件确定
我们需要对两个字符串循环处理,但是若是两个循环貌似就将多余了,之前有些想不明白应该怎么做
其实很简单,因为
所以,只需要在循环中用两个条件用 或
相连即可
while(n >= 0 || m >= 0)
这样就可以同时访问两个字符串,并且会在长度最长的字符串时终止循环
获取单个元素
因为在循环中,我们不清楚哪个长度长,因此需要利用三元表达式
进行判断获取值
并在处理时,对于长度不够的,进行 补零 处理。
int a1 = aLen >= 0 ? a[aLen--] : '0';
int b1 = bLen >= 0 ? b[bLen--] : '0';
代码中其实就包含了 抽象 的计算机思维,因为对于计算机来说,a和b本质上没有区别,仅仅只需要在它没有的时候,给零处理就行
当然,其实可以同样通过三元表达式确定最长的字符串
string max = a.length() > b.length() ? a : b;
- 1
但是这将会 浪费空间 并且 其实我们没有必要知道哪个长,因为只需要对短的进行补零就行
逐位相加
在从字符串中获取单个字符之后,就可以将其转换为数字——通过- '0'
实现
并进行相加
这里需要注意的是,因为需要处理上一位相加的进位
因此,需要在相加时 ,加上进位的变量
因为在第一次相加时,是不可能产生进位的(因为没有上一位的运算),所以将表示进位的变量carry
设置初始值为0
而在后面的运算中,carry的值将会根据运算情况进行改变
int sum = (a1 - '0' ) + (b1 - '0') + carry;
判断溢出情况
在完成运算跳出循环时,很可能第一位的相加也产生进位,但是无法在循环中处理
因此,需要在循环外进行特殊处理
if(carry != 0){
ans += (carry + '0');
}