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

高精度整数加法_牛客题霸_牛客网 (nowcoder.com)

题目大意就是两个大整数相加

解决代码

#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();
}

代码解释

输入

字符串形式输入两个整数

处理函数——逐位相加

循环条件确定

我们需要对两个字符串循环处理,但是若是两个循环貌似就将多余了,之前有些想不明白应该怎么做

其实很简单,因为

  • 两个条件都是需要满足
  • 同时执行

所以,只需要在循环中用两个条件用 相连即可

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;

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

逐位相加

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

并进行相加

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

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

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

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

int sum = (a1 - '0' ) + (b1 - '0') + carry;

判断溢出情况

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

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

if(carry != 0){
	ans += (carry + '0');
}

最后

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部