高精度算法-加法

//高精度算法-加法
#include <iostream>
#include <string>
#include <vector>
#include<cmath>
using namespace std;
int main()
{
    //s1 数字1 s2 数字2 a1 数字1的各个位逆着存储 a2 同a1原理一致 a3即后续模拟加法的存储数组
    string s1, s2;
    int a1[200], a2[200], a3[200] = { 0 }; // 200作用于你要的高精度加法中2个数字的长度 所以不要输入诸如300个1组成的111....111 除非你改动上面的数组数量QAQ
    getline(cin, s1); getline(cin, s2); // 加法的2个数的输入
    for (int i = 0; i < s1.size(); i++) {
        a1[s1.size()-1-i] = s1[i]-'0'; //倒着放置 模拟竖式加法需要 
    }
    for (int i = 0; i < s2.size(); i++) { // 方法依旧
        a2[s2.size() - 1 - i] = s2[i] - '0'; 
    }
    int len = s1.size();
    if (s2.size() > s1.size()) { // 找以下这2个数的最长长度 竖式加法需要用到
        len = s2.size();
    }
    for (int i = 0; i < len; i++) { //len必须是最长的那个字符串 加法就是这样
        a3[i] = a1[i] + a2[i]; // 两个数的每一个位上的数字相加
    }
    for (int k = 0; k < len; k++) { // 因为我们给a3有200个初始化元素 但并不是每个都用的上的 所以直接用len 即长度最长的有效元素数量
        if (a3[k] >= 10) {
            a3[k + 1] += a3[k] / 10; //比如2数个位相加 10+21=31 所以/10之后就是3 这个3就是要加到十位上的 
            a3[k] = a3[k] % 10; // 当31被拿掉3后 也就是被拿掉了3*10 你会发现其实就是与10取余的结果 即31 % 10 = 1 获得个位
        }
    }
    if (a3[len] != 0) {
        len++; //因为a3的初始化是所有元素为0
        //而99+2的结果是101 是个三位数 所以是a3代表的数字长度需要增加
        //抽象表达: 此时的a3=[11 9 0 0 0 0....]
        //11分出去一个十位 所以这时a3=[1 10 0 0 0 0 0....]
        //十位上是10 所以需要进1 所以a3=[1 0 1 0 0 0 0 0....]
        //len为还未计算时的结果默认长度,但是我们经过竖式加法过程之后,可能就会出现,99 + 2 相加结果最高长度增加1位的情况
        //即原本数字长度最高为2 但是结果计算后 99 + 2 为三位数了 加了1位 所以len++
        //为什么是a3[len] != 0 因为数组从0计数
    }
    for (int i = len - 1; i >= 0; i--) {
        cout << a3[i];
    }

    return 0;
}

高精度加法 用于解决加法问题 如超过long long 数据类型所能承受的最大数字之间的加法.

比如222222222222222222222222222222222222222222222+22222222222222222222222222222

理解方法我已通过注释表达A.A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值