高精度代码模板

一、高精度加法

cur=cur+now

vector<int> cur;
vector<int> now;
//cur和now已经逆序存放,目的将cur+now结果存入cur中
int x=0;
int i=0;
while(i<cur.size()&&i<now.size()){
    cur[i]=cur[i]+now[i]+x;
    x=cur[i]/10;
    cur[i]=cur[i]%10;
    ++i;    
}
//cur小的时候
if(i==cur.size()){
    for(;i<now.size();++i){
        int temp=now[i]+x;
        cur.push_back(temp%10);
        x=temp/10;
    }
}
if(x)
  cur.push_back(x);
//cur是最终结果
二、高精度减法

c=a-b

int a[100]={};
int b[100]={};
int c[100]={};
逆序存储a和b
if(a<b){//伪代码,保证a是被减速
    flag=true;
    swap(a,b);
}
while(c_len<=a_len||c_len<=b_len){
    if(a[c_len]<b[c_len]{
        a[c_len]+=10;
        a[c_len+1]--;
    }
    c[c_len]=a[c_len]-b[c_len];
    c_len++;
}
while(c[c_len]==0&&c_len>0) --c_len;//前面的0是无效的,如果结果是0需要保存
/*if(flag) 添加负号*/
三、高精度乘法

c=a*b

int a[100]={};
int b[100]={};
int c[200]={};
逆序存储a和b
for(int i=0;i<a_len;++i){//让a当做乘数,一位一位乘
    int x=0; //每次乘都有一个进位
    for(int j=0;j<b_len;++j){
        c[i+j]+=x+a[i]*b[j];//c[k]表示结果中逆序第k+1位的数字,需要累加起来
        x=c[i+j]/10;
        c[i+j]%=10;
    }
    c[i+b_len]+=x;//最后的进位,当时进位可以是0,少个判断直接相加。
}
c_len=a_len+b_len-1;//最大位数-1 但是不一定
while(c[c_len]==0&&c_len>0) --c_len;
//至此0~c_len为所求结果
四、高精度除法
4.1、除以低精度

c=a/b

int a[200]={};
int b;
int c[100]={};
正序存储a,确保b不为0
int x=0;
for(int i=0;i<a_len;++i){
    c[i]=(x+a[i])/b;
    x=(x+a[i])%b;
    x*=10;
}
int j=0;
while(c[j]==0&&j<a_len-1) ++j;
//至此j~a_len-1为所求结果
4.2、除以高精度

q=a/b····res

#include<bits/stdc++.h>
using namespace std;
vector<int> a;
vector<int> b;
int divide(vector<int> & res,vector<int> & b){//保证够减,高精度减 模拟 一次除法
    int num=0;
    vector<int> x=b;
    reverse(x.begin(),x.end());
    while(res.size()>b.size()||(res.size()==b.size()&&res>=b)){
        reverse(res.begin(),res.end());
        vector<int> c;
        ++num;
        for(int i=0;i<res.size();++i){
            if(res[i]<x[i]){
                res[i]+=10;
                res[i+1]--;
            }
            c.push_back(res[i]-x[i]);
        }
        while(c.size()>0&&c[c.size()-1]==0) c.pop_back();//为0的余数不要了,原因是我们的res会继续为后面的除法做贡献,前导0对后续除法来说无意义,甚至影响判断~
        res=c;
        reverse(res.begin(),res.end());
    }
    return num;
}

int main(void){
/*--------------初始化-----------------*///确保初始化没有前导0。
    string s;
    cin>>s;
    for(int i=0;i<s.size();++i)
       a.push_back(s[i]-'0');
    cin>>s;
    for(int i=0;i<s.size();++i)
       b.push_back(s[i]-'0');
/*--------------除法-----------------*/
    vector<int> res;//余数
    vector<int> q;//商
    for(int i=0;i<a.size();++i){
        res.push_back(a[i]);
        if(res.size()<b.size()){//位数不够
            q.push_back(0);
        }else{
            if(res.size()==b.size()&&res<b){//位数刚好够,但是没它大
                q.push_back(0);
            }else{
                q.push_back(divide(res,b));//返回商,并且引用式参数,余数res会自动更改。
            }
        }
    }
    //余数为空,则余数为0
    int j=0;
    while(j<q.size()-1&&q[j]==0)
        ++j;
    vector<int> temp(q.begin()+j,q.end());
    swap(q,temp);
    //q是商
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yorelee.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值