高精度加减乘除

这篇博客介绍了如何使用C++实现高精度的加法、减法、乘法和除法运算。通过模拟手算过程,代码简洁而高效,尤其在处理大整数时能保持精确。加法和减法通过逆序处理和逐位运算实现,乘法直接用整体乘数进行计算,除法则通过不断求余和商的计算完成。整个过程体现了良好的算法设计和代码优化技巧。
摘要由CSDN通过智能技术生成

高精度加减乘除

加法

思想就是模拟加法的过程,我们先将两个数逆序之后进行操作,便于进位
在这里插入图片描述

/*
思想是模拟数据加减的过程
*/

#include<iostream>
#include<vector>
using namespace std;
vector<int> add (vector<int> &A,vector<int> &B)
//传地址可以减少数据再次复制
{
    vector<int> C;
    int t=0;
    for(int i=0,j=0;i<A.size()||j<B.size();i++,j++)
    {
        if(i<A.size())  t+=A[i];
        if(j<B.size())  t+=B[j];
        C.push_back(t%10);
        t=t/10;
    }
    if(t)  C.push_back(t);
    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);//auto可以保持与后面数据一样的数据类型
    for(int i=C.size()-1;i>=0;i--)
        cout << C[i];
    return 0;
}

减法

相比于加法,减法稍微复杂一点
在这里插入图片描述

#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
bool cmp(vector<int>&A,vector<int>&B)
{
    //这个处理很妙,先比较是否一样长,在根据判断结果决定是否逐个比较
    if(A.size()!=B.size())  return A.size()>B.size();
        for(int i=A.size();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;
        if(i<B.size())  t=t-B[i];
        C.push_back((t+10)%10);
        //这一步也很巧妙
        if(t<0) t=1;
        else t=0;
    }
    while(C.size()>1&&C.back()==0) C.pop_back();
    /*这一步是为了去掉前导0
    C.back()是指最后一位数,即结果的最高位*/
    return C;
}
int main()
{
    string a,b;
    cin>>a>>b;
    vector<int> A,B,C;
    for(int i=a.size()-1;i>=0;i--)  A.push_back(a[i]-'0');
    for(int j=b.size()-1;j>=0;j--)  B.push_back(b[j]-'0');
    //逆序存储
    if(cmp(A,B))
    {
        C=sub(A,B);//使得A永远是最大的数,便于模拟减法过程
        for(int i=C.size()-1;i>=0;i--)
            cout<<C[i];
    }
    else
    {
        C=sub(B,A);
        printf("-");
        for(int i=C.size()-1;i>=0;i--)
            cout<<C[i];
    }
    return 0;
}

这里感觉到了如何将代码写的简洁,尤其是模拟部分真的很妙

乘法

在这里插入图片描述
这个题目要注意的是虽然依然是模拟乘法的过程,但是由于B这个乘数并不大,所以直接用B这个整体去乘,而不是一位位的乘;
然后思路跟前面差不多

#include<iostream>
#include<vector>
using namespace std;
vector<int> chen(vector<int>&A,int B)
{
     vector<int>C;
    int t=0;
    for(int j=0;j<A.size();j++)
        {
            C.push_back((B*A[j]+t)%10);
            t=(B*A[j]+t)/10;
        }
    if(t>0) C.push_back(t);
    while(C.size()>1&&C.back()==0) C.pop_back();
    //依旧是去除前导0的过程
    return C;
}
int main()
{
    string a;
    int B;
    cin>>a>>B;
    vector<int>A;
    for(int i=a.size()-1;i>=0;i--)  A.push_back(a[i]-'0');
    vector<int>C;
    C=chen(A,B);
    for(int i=C.size()-1;i>=0;i--)
        cout<<C[i];
    return 0;
}

除法

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int t=0;
vector<int> div(vector<int>& A,int b)
{
    vector<int>C;
    for(int i=A.size()-1;i>=0;i--)
    {
        t=t*10+A[i];
        C.push_back(t/b);
        t=t%b;
    }
    reverse(C.begin(), C.end());//倒序
    while (C.size() > 1 && C.back() == 0) C.pop_back();//去掉前导0
    return C;
}
int main()
{
    string a;
    cin>>a;
    int b;
    cin>>b;
    vector<int>A;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    auto C=div(A,b);
    for(int i=C.size()-1;i>=0;i--)
        cout<<C[i];
        cout<<endl<<t;
    return 0;
}

我觉得主要是理解模拟手算的过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值