当前位置: 首页 > article >正文

高精度算法:加减乘除 (学习笔记)

加法:

现有vector<int>a,b;并且已经输入了内容且倒置

vector<int> plus(vector<int>a,vector<int> b){

        int as = a.size();

        int bs = b.size();

        vector<int>total;

        int carry = 0;

        int ar = 0, br = 0; //读取位数

        while (ar < as && br < bs) {

                int tmp = a[ar++] + b[br++]+carry;

                if (tmp >= 10) {

                        carry = 1; //判断进位

                        tmp = tmp % 10;

                }

                else {

                        carry = 0; //没有进位需要记住去置空

                }

                total.emplace_back(tmp);

        }

        while (ar < as) {

                int tmp = a[ar++] + carry;

                if (tmp >= 10) {

                        carry = 1;

                        tmp %= 10;

                }

                else carry = 0;

                total.emplace_back(tmp);

        }

        while (br < bs) {

                int tmp = b[br++] + carry;

                if (tmp >= 10) {

                        carry = 1;

                        tmp %= 10;

                }

                else carry = 0;

                total.emplace_back(tmp);

        }

        if (carry == 1)total.emplace_back(carry);

        return total; //记得回去倒置

}

可以判断长度后进行优雅的处理(假设a的长度大于等于b的)

For(int i=0,t=0;i<a.size();i++){

        t+=a[i];

        If(i<b.size())t+=b[i];

        Total.emplace_back(t%10);

        If(t>=10)t=1;

        Else t=0;

}

这样的处理就更加的优雅了

减法

如果是两个整数的减法,需要确定一下两个数的大小,也就是我们需要再来一个cmp的函数来比较a和b的大小

Cmp:

int cmp(vector<int> a, vector<int> b) {

        if (a.size() > b.size())return 1;//a更长一定更大

        else if (a.size() < b.size()) {

                return 0;//b更长,b更大

        }

        else{         //位数一样,从最高位开始比较,知道出现一个不一样的数,返回大的

                for (int i = a.size() - 1; i >= 0;i--) {

                        if (a[i] != b[i])return a[i] > b[i];

                }

        }

        return 1;     //一样的就返回1

}

减法的具体的函数:(也是优雅的!!)

vector<int> sub(vector<int> a,vector<int> b){//a,b记得倒置

        int as = a.size();  //默认a更大,我们可以在函数外进行比较后放入这个函数

        vector<int>total;

        int t = 0;

        for (int i = 0; i < as; i++) {

                t = a[i] - t;

                if (i < b.size())t -= b[i];

                        total.emplace_back((t + 10) % 10); //+10防止出现负数

                if (t >= 0)t = 0;

                else t = 1;

        }

        while (total.size() > 1 && total.back() == 0)total.pop_back();

        return total;//记得倒置

}

一大乘以一小的乘法:

和加法一样,没有多大的区别,有的话就是carry的大小的最后carry的处理

直接上代码:

vector<int> time(vector<int> a,int b){

        int as = a.size(); //记得倒置

        int t = 0;

        vector<int> total;

        for (int i = 0; i < as; i++) {

                t += a[i] * b;

                total.emplace_back(t % 10);

                t /= 10;

        }

        while (t) {

                total.emplace_back(t % 10);

                t /= 10;

        }

        return total;//记得倒置

}

一大除一小的除法:

只是需要涉及到的有3个翻转,具体的操作和大横线除法一样,从最高位开始计算,依次先

余数乘以10加上现在位的数除以b得到当前位置的答案,余数为当前余数求b的余数,最后一次翻转加上去掉后缀的0

具体的代码在下面:

vector<int> div(vector<int> a,int b){  //这里的a不用倒置,但是为了统一口径,就都倒置下

        reverse(a.begin(),a.end());  //复原下

        vector<int> res;

        r = 0;

        for (int i = a.size() - 1; i >= 0; i--) {

                r = r * 10 + a[i];

                res.emplace_back(r / b);

                r %= b;

        }

        reverse(res.begin(),res.end());

        while (res.size() > 1 && res.back() == 0)res.pop_back();

        return res;  //记得倒置再输出结果

}


http://www.kler.cn/a/456868.html

相关文章:

  • 动手做计算机网络仿真实验入门学习
  • HarmonyOS开发:关于帧动画使用分享
  • java实现预览服务器文件,不进行下载,并增加水印效果
  • WebRTC:实现浏览器与移动应用的实时通信
  • 网络安全 | 云安全与物联网(IoT)
  • FFmpeg 中 examples 使用教程
  • 强大的接口测试可视化工具:Postman Flows
  • JAVA: 子类“覆盖”父类的成员变量
  • React里使用uuid插件--生成随机的id
  • 大型系统中 Redis 的优化与挑战
  • Ubuntu升级ssh版本到9.8
  • AppAgent 源码 (AndroidController 类 )
  • 【LLM论文日更】| 训练大型语言模型在连续潜在空间中进行推理
  • 服务器被攻击怎么办
  • 如何注册华为云国际版账户:详细步骤指南
  • info There appears to be trouble with your network connection. Retrying
  • YOLOX算法及其改进
  • C语言实现跨主机通讯
  • 6-Gin 路由详解 --[Gin 框架入门精讲与实战案例]
  • 电商项目-数据同步解决方案(三)商品上架同步更新ES索引库
  • vue3使用element-plus,解决 el-table 多选框,选中后翻页再回来选中失效问题
  • 如何部署SparkHistoryServer
  • 【Unity/C#】Fisher-Yates洗牌算法
  • 湖仓一体架构解析:数仓架构选择(第48天)
  • 软件安全性测试有多重要?好用的安全测试工具有哪些?
  • 使用 CSS 的 `::selection` 伪元素来改变 HTML 文本选中时的背景颜色