高精度算法:(有时间补充)

本文详细介绍了如何使用C++实现大整数的加法、减法、乘法和除法,包括处理进位、数组操作以及高精度计算的方法。
摘要由CSDN通过智能技术生成

大整数加法:
数组第0位存放个位数。因为会有进位问题,在数组最后加上比较简单
代码怎么写:
 

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
//加上引用是为了提高效率 
//C=A+B 大整数相加 
//模板不一定是一种,记住思路,哪里可以变,哪里不可以 
vector<int> add(vector<int>&A,vector<int>&B)
{
    //先列出答案数组 
    vector<int>c;
    int t=0;
    for(int i=0;i<A.size()||i<B.size();i++)
    {
        if(i<A.size()) t+=A[i];
        if(i<B.size()) t+=B[i];
        // 上面两行经历后t里面存的是 A[i]+B[i]+t(上一位的进位) 
        c.push_back(t%10);
        t/=10;
    } 
    //最高位还有进位的 话,就要补上1 
    if(t) c.push_back(1);
    return c;
}
int main()
{
    string a,b;cin>>a>>b;
    vector<int>A,B;
    for(int i=a.size()-1;i>=0;i--)
    {
        A.push_back(a[i]-'0');
    }
    for(int i=b.size()-1;i>=0;i--)
    {
        B.push_back(b[i]-'0');
    }
    auto c=add(A,B);
    for(int i=c.size()-1;i>=0;i--) cout<<c[i];
    return 0;
 } 

大整数减法:
大整数存储都是一致的。
先从个位开始减,不够减的话就向前借位 
假定A,B都是正数
如果存在负数,分情况讨论 
要保证A>=B.如果反之的话,就计算B-A,去负号 
Ai-Bi-t(t表示上一位有没有借位,如果借位了,t=1,反之,t=0) 
① Ai-Bi-t >=0 Ai-Bi-t
②Ai-Bi-t <0 Ai-Bi+10-t 
 

#include<bits/stdc++.h>
using namespace std;
//C=A-B
bool check(vector<int>&A,vector<int>&B)
{
    //先判断位数
    if(A.size()!=B.size())  return A.size()>B.size();
    //比大小,从高位开始比较 
    for(int i=A.size()-1;i>=0;i--)
    {
        if(A[i]!=B[i]) return A[i]>B[i];    
    }
    return true;
}
vector<int> sub(vector<int>&A,vector<int>&B)
{
    vector<int>c;
    int t = 0;
    for(int i=0;i<A.size();i++)
    {
        t = A[i]-t; 
        //一定要判断B[i] 是否还存在 
        if(i<B.size()) t-=B[i];
        //对于t>=0,t+10)再%10,就是t本身
        //t<0 ,t+10)再%10,就是t+10.使用这个式子把两种情况合二为一
        //t一定是个位数,if t>0  
        c.push_back((t+10)%10);
        //判断是否要借位 
        if(t<0) t=1;
        else t=0; 
     } 
     //这一步是去除前导0,但是如果结果就是0的话,要留一位
     //c.back()是0的话就把它去掉,因为是倒着放的,所以看c的最后 
     while(c.size()>1&&c.back()==0)  c.pop_back();
     return c;
     
}
int main()
{
    string a,b;
    vector<int>A,B;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-‘0’);
    for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-‘0’);
    //先来判断大小
    if(check(A,B))
    {
        auto C=sub(A,B);
        for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    }
    else 
    {
        auto C=sub(B,A);
        cout<<"-";
        for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    }
    return 0;
}

大整数乘法:
这里是把乘数 b看成一个数 ,就是一起乘
这里的乘数是一个大整数乘以一个比较小的数 
 

#include<bits/stdc++.h>
using namespace std;
//C = A*b;(高精度乘以一个低精度数) 
vector<int> mul(vector<int>&A,int b)
{
    vector<int>c;
    int t=0;
    //只要t不是0就一直循环 
    for(int i=0;i<=A.size()||t;i++)
    {
        if(i<A.size()) t += A[i]*b;
        c.push_back(t%10);
        t/=10;
    } 
    while(c.size()>1&&c.back()==0) c.pop_back();
    return c;
}
int main()
{
    string a;
    int b;
    vector<int>A;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    vector<int> C = mul(A,b);
    for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    return 0; 
} 

大整数除法:
一个高精度除以一个低精度
 

#include<bits/stdc++.h>
using namespace std;
vector<int> div(vector<int>&A,int b,int &r)
{
    //A/b,余数位r,c是商 
    vector<int>c;
    int t=0;
    r=0; 
    //除法就是从最高位开始了,与其他三种不同处 
    //为了保证出现其他运算才这样的,有时间可以把这个优化一下 
    for(int i=A.size()-1;i>=0;i--)
    {
        
        r =r*10+A[i];
        c.push_back(r/b);
        r%=b;
    }
    
    reverse(c.begin(),c.end());
    while(c.size()>1&&c.back()==0) c.pop_back();
    return c; 
    //余数通过引用传回去 
}
int main()
{
    string a;
    int b;
    cin>>a;
    vector<int>A;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    int r;
    auto c = div(A,b,r);
    for(int i=c.size()-1;i>=0;i--) cout<<c[i];
    cout<<endl<<r<<endl;
    return 0; 
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值