c++ 正整数的大数高精度 加减乘除

说明:

在本代码中大数 12345(即一万两千三百四十五)在vector中以相反顺序存储,可以想象vector以原点为起点,向x轴负方向增长。
由于我比较懒,只实现了正整数的加减乘除,其中减法a-b要求a>b,否则返回0;除法a/b要求a>b,否则返回0;

vector<int>a ={
   5,4,3,2,1};

即 下标为零的位置为个位。
如图。
在这里插入图片描述

实现思路 通过模拟人在纸上手动四则运算的过程来实现高精度。

加减法中需要先将短的数在高位补零,123(一百二十三)+2345(二百三十四)时,将123补为0123。

vector<int>a;//左操作数
vector<int>b;//右操作数
vector<int>c;//结果数组
int ad=0//进位 或者借位标志。
  • 加法:从个位开始按位相加,当前位结果为 ( a [ i ] + b [ i ] + a d ) % 10 (a[i]+b[i]+ad)\%10 (a[i]+b[i]+ad)%10,进位为 ( a [ i ] + b [ i ] + a d ) / 10 (a[i]+b[i]+ad)/10 (a[i]+b[i]+ad)/10,注意运算完成后如果进位不为0需要把进位作为最高位。
  • 减法:从个位开始按位相减
    • 如果当前a[i]-ad >=b[i] : c[i]=a[i]-ad -b[i]; ad=0;
    • 如果当前a[i]- ad < b[i]: c[i]=a[i]-ad+10-b[i]; ad=1;
    • 因为a>b,所以最后ad一定是0;
  • 乘法:从个位开始按位相乘,但是注意a[i]与b乘完之后的结果要进位,如图是a的值为34(vectora={4,3}),b的值为123(vectorb={3,2,1})的情况。

如图
在这里插入图片描述

  • 每一位乘积左移

    • 当i等于0时,a[i]*b的结果不需要左移
    • 当i等于1时,a[i]*b的结果需要左移一位,即在低位添加一个0占位。
    • 即结果数组的低位需要提前添加i个0来占位。
  • 除法 除法是大数里面最麻烦的,可以转化为减法来做。

先来看一个简单的10/2的情况

int a=10,b=2;
int re=0;
while(a>=b){
   
a=a-b;
re++;
}
cout<<re;

在大数除法中也是采用这种减法来做,我们先将短的数b与长的数a对齐,然后用a-b,够减当前位的值加一,直到不够减就将b除以10,然后计算下一位的结果。如图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当b的值小于b的初值的时候,循环结束。

代码如下

#include<iostream>
#include<stack>
#include<vector>//数组方向为x轴负方向。
#include<string>
using namespace std;
int com(const vector<int>& a, const vector<int>& b) {
   
	if (a.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值