高精度算法(加减乘除)

高精度算法 -> 数学的竖式运算

高精度加法过程模拟:

123 + 59

1 2 3

+ 5 9

-------------------------

     1      7       12

1、个位对齐(数据的末位对齐)

stirng a , b;

cin>>a>>b;

int la = a.size() , lb = b.size();

将字符串倒置,使得末尾对齐

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

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

2、获取位数、对位相加

int s1[250] , s2[250];

for(int i=0;i<la;i++) s1[i+1] = a[i]-'0';

for(int i=0;i<lb;i++) s2[i+1] = b[i]-'0';

3、对位相加

int s[250];

两数相加的最大位数 = max(la , lb) + 1;

int len = max(la,lb)+1;

for(int i=1;i<=len;i++) s[i] = s1[i] + s2[i];

4、进位处理

for(int i=1;i<=len;i++) s[i+1] += s[i] / 10 , s[i] %= 10;

5、相加完之后,s[len]有可能是0 -> 数字最高位不能是0

去前导零

while(s[len] == 0 and len > 1) len--;

6、倒置输出

for(int i=len;i>=1;i--) cout<<s[i];

高精度减法过程模拟:

string a,b;

cin>>a>>b;

int la = a.size();

int lb = b.size();

1、判断相减是否会出现负数问题(模拟相减的过程是利用大的数据 - 小的数据)

大的数据 - 小的数据 = a - b

if(la == lb and a<b){

cout<<'-';

swap(a,b);

}else if(la < lb){

cout<<'-';

swap(a,b);

swap(la,lb);

}

2、步骤2:

字符串a和字符串b倒置对位

取位数a->s1 , b->s2 (s1、s2分别是int数组)

3、对位相减:int len = max(la,lb);

4、借位处理:

for(int i=1;i<=len;i++){

if(s[i]<0){

s[i]+=10;

s[i+1]--;

}

}

5、去前导零

6、倒置输出

高精度除法过程模拟:

#include <bits/stdc++.h>

using namespace std;

string a;

long long b;

long long s[250]; // 存放被除数

long long r[250]; // 存放商

int main(){

cin>>a>>b;

int la = a.size();

//出发从高位开始,所以不用倒置对位

for(int i=0;i<la;i++) s[i+1] = a[i]-'0';

//模拟除法过程:求商

for(int i=1;i<=la;i++){

//拿到上一次的余数和这一次的数值组成一个数值

s[i] = s[i-1] * 10 + s[i];

r[i] = s[i] / b;

s[i] = s[i] % b;

}

//去前导零

int k = 1;

while(r[k] == 0 and k<la) k++;

for(int i=k;i<=la;i++) cout<<r[i];

cout<<"余数部分 = "<<s[la];

return 0;

}

高精度乘法过程模拟

a4

a3

a2

a1

b2

b1

b1*a4

b1*a3

b1*a2

b1*a1

b2*a4

b2*a3

b2*a2

b2*a1

c1 = b1*a1

c2 = b1*a2 + b2*a1

c3 = b1*a3 + b2*a2  

c4 = b1*a4 + b2*a3

#include<bits/stdc++.h>

using namespace std;

int main(){

    //乘的次数以大的为主,累加以小的为主

string a,b;

cin>>a>>b;

int la = a.size();

int lb = b.size();

//保证a的长度 > b的长度

if(la < lb){

swap(la,lb);

swap(a,b);

}

//倒置对位

//累乘过程:s1->a  s2->b c对应累乘结果  -> 长度len = la+lb+1

for(int i=1;i<=lb;i++){

for(int j=1;j<=la;j++){

c[i+j-1] += b[i] * a[i];

}

}

//进位处理

//去前导零

//倒序输出

    return 0;

}

  • 42
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值