【模板】【acwing】高精度加法、减法、乘法、除法

高精度加法:

复制代码
// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
    if (A.size() < B.size()) return add(B, A);

    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i ++ )
    {
        t += A[i];
        if (i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }

    if (t) C.push_back(t);
    return C;
}

作者:yxc
链接:https://www.acwing.com/blog/content/277/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复制代码

高精度减法:

复制代码
// C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(vector<int> &A, vector<int> &B)
{
    vector<int> C;
    for (int i = 0, t = 0; i < A.size(); i ++ )
    {
        t = A[i] - t;
        if (i < B.size()) 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();
    return C;
}

作者:yxc
链接:https://www.acwing.com/blog/content/277/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复制代码

高精度乘法:

复制代码
// C = A * b, A >= 0, b >= 0
vector<int> mul(vector<int> &A, int b)
{
    vector<int> C;

    int 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;
}

作者:yxc
链接:https://www.acwing.com/blog/content/277/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复制代码

高精度除法:

复制代码
// A / b = C ... r, A >= 0, b > 0
vector<int> div(vector<int> &A, int b, int &r)
{
    vector<int> C;
    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;
}

作者:yxc
链接:https://www.acwing.com/blog/content/277/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复制代码

高精度加法:

791. 高精度加法 - AcWing题库

代码:

复制代码
#include<bits/stdc++.h>
#define rep(i,a,b)  for(int i=a;i<=b;i++)
#define rpe(j,b,a)  for(int j=b;j>=a;j--)
using namespace std;
vector<int> add(vector<int>&a,vector<int>&b){
    if(a.size()<b.size()) return add(b,a);
    vector<int> c;
    int t=0;
    rep(i,0,a.size()-1){
        t+=a[i];
        if(i<b.size()) t+=b[i];
        c.push_back(t%10);
        t/=10;
    }
    if(t) c.push_back(t);
    return c;
}
int main(){
    string s1,s2;
    vector<int>a,b;
    cin>>s1>>s2;
    rpe(i,s1.length()-1,0) a.push_back(s1[i]-'0');
    rpe(i,s2.length()-1,0) b.push_back(s2[i]-'0');
    auto c=add(a,b);
    rpe(i,c.size()-1,0) cout<<c[i];
    return 0;
}
复制代码

 压9位的代码:

复制代码
#include <iostream>
#include <vector>

using namespace std;

const int base = 1000000000;

vector<int> add(vector<int> &A, vector<int> &B)
{
    if (A.size() < B.size()) return add(B, A);

    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i ++ )
    {
        t += A[i];
        if (i < B.size()) t += B[i];
        C.push_back(t % base);
        t /= base;
    }

    if (t) C.push_back(t);
    return C;
}

int main()
{
    string a, b;
    vector<int> A, B;
    cin >> a >> b;

    for (int i = a.size() - 1, s = 0, j = 0, t = 1; i >= 0; i -- )
    {
        s += (a[i] - '0') * t;
        j ++, t *= 10;
        if (j == 9 || i == 0)
        {
            A.push_back(s);
            s = j = 0;
            t = 1;
        }
    }
    for (int i = b.size() - 1, s = 0, j = 0, t = 1; i >= 0; i -- )
    {
        s += (b[i] - '0') * t;
        j ++, t *= 10;
        if (j == 9 || i == 0)
        {
            B.push_back(s);
            s = j = 0;
            t = 1;
        }
    }

    auto C = add(A, B);

    cout << C.back();
    for (int i = C.size() - 2; i >= 0; i -- ) printf("%09d", C[i]);
    cout << endl;

    return 0;
}

作者:yxc
链接:https://www.acwing.com/activity/content/code/content/39792/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复制代码

 792. 高精度减法 - AcWing题库

代码:

复制代码
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rpe(j,b,a) for(int j=b;j>=a;j--)
using namespace std;
bool cmp(vector<int>&a,vector<int>&b){
    if(a.size()!=b.size()) return a.size()>b.size();
    rpe(i,a.size()-1,0)
        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;
    rep(i,0,a.size()){
        t+=a[i];
        if(i<b.size())  t-=b[i];
        c.push_back((t+10)%10);
        if(t<0) t=-1;
        else t=0;
    }
    while(c.back()==0&&c.size()>1) c.pop_back();
    return c;
}
int main(){
    string s1,s2;
    vector<int> a,b,c;
    cin>>s1>>s2;
    rpe(i,s1.size()-1,0) a.push_back(s1[i]-'0');
    rpe(i,s2.size()-1,0) b.push_back(s2[i]-'0');
    if(cmp(a,b)) c=sub(a,b);
    else cout<<'-',c=sub(b,a);
    rpe(i,c.size()-1,0) cout<<c[i];
    return 0;
}
复制代码

 793. 高精度乘法 - AcWing题库

复制代码
#include<bits/stdc++.h>
#define rep(i,a,b)  for(int i=a;i<=b;i++)
#define rpe(j,b,a)  for(int j=b;j>=a;j--)
using namespace std;
vector<int> mul(vector<int>&a,int b){
    vector<int> c;
    int 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.back()==0&&c.size()>1) c.pop_back();
    return c;
}
int main(){
    string s1;
    int b;
    vector<int> a;
    cin>>s1>>b;
    rpe(i,s1.size()-1,0) a.push_back(s1[i]-'0');
    auto c=mul(a,b);
    rpe(i,c.size()-1,0) cout<<c[i];
    return 0;
}
复制代码

794. 高精度除法 - AcWing题库

复制代码
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rpe(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
vector<int> div(vector<int>a,int b,int &r){
    vector<int> c;
    r=0;
    rpe(i,a.size()-1,0){
        r=r*10+a[i];
        c.push_back(r/b);
        r=r%b;
    }
    reverse(c.begin(),c.end());
    while(c.back()==0&&c.size()>1) c.pop_back();
    return c;
}
int main(){
    string s;
    int b,r;
    vector<int> a;
    cin>>s>>b;
    rpe(i,s.size()-1,0) a.push_back(s[i]-'0');
    auto c=div(a,b,r);
    rpe(i,c.size()-1,0) cout<<c[i];
    cout<<endl<<r;
    return 0;
}
复制代码

 

posted @   infocodez  阅读(52)  评论(0编辑  收藏  举报
编辑推荐:
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
阅读排行:
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· 为什么AI教师难以实现
· 如何让低于1B参数的小型语言模型实现 100% 的准确率
· AI Agent爆火后,MCP协议为什么如此重要!
点击右上角即可分享
微信分享提示