高精度加法,减法,乘法,除法

**高精度加法模板
#include<bits/stdc++.h>
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;
    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;
}
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');
    auto C=add(A,B);
    for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
    return 0;
}

**1268 - 高精度加法
**来源:东方博宜oj  oj.czos.cn
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[250],b[250],c[500];
int main()
{
    cin>>s1>>s2;
    for(int i=0;i<s1.size();i++)  a[i]=s1[s1.size()-1-i]-'0';
    for(int i=0;i<s2.size();i++)  b[i]=s2[s2.size()-1-i]-'0';
    int len=max(s1.size(),s2.size());
    for(int i=0;i<len;i++)
    {
        c[i]=c[i]+a[i]+b[i];
        if(c[i]>=10)
        {
            c[i+1]=c[i+1]+c[i]/10;
            c[i]=c[i]%10;
        }
    }
    if(c[len]) len++;
    for(int i=len-1;i>=0;i--)
    {
        printf("%d",c[i]);
    }
    return 0;
}

**高精度减法
#include<bits/stdc++.h>
using namespace std;
//判断是否有A>=B
bool cmp(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;
    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;
    }
    //删除前导0
    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(cmp(A,B))
    {
        auto C=sub(A,B);
        for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
    }
    else
    {
        auto C=sub(B,A);
        printf("-");
        for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
    }
    return 0;
}

** 1269 - 高精度减法 
** 来源:东方博宜oj  oj.czos.cn

*解法一:
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[250],b[250],c[250];
int len,p;
char f='+';
int main()
{
    cin>>s1>>s2;
    if(s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2))
    {
        f='-';
        swap(s1,s2);
    }
    for(int i=0;i<s1.size();i++) a[i]=s1[s1.size()-1-i]-'0';
    for(int i=0;i<s2.size();i++) b[i]=s2[s2.size()-1-i]-'0';
    len=s1.size();
    for(int i=0;i<len;i++)
    {
        if(a[i]<b[i])
        {
            a[i+1]=a[i+1]-1;
            a[i]=a[i]+10;
        }
        c[i]=a[i]-b[i];
    }
    if(f=='-') cout<<f;
    for(int i=len;i>=0;i--)
    {
        if(c[i])
        {
            p=i;
            break;
        }
    }
    for(int i=p;i>=0;i--)
    {
        cout<<c[i];
    }
    return 0;
}

*解法二:
#include<bits/stdc++.h>
using namespace std;
int a[250],b[250],c[250];
bool f=true;
string sub(string s1,string s2)
{
    for(int i=0; i<s1.size(); i++) a[i]=s1[s1.size()-1-i]-'0';
    for(int i=0; i<s2.size(); i++) b[i]=s2[s2.size()-1-i]-'0';
    int len=s1.size();
    for(int i=0; i<len; i++)
    {
        if(a[i]<b[i])
        {
            a[i+1]=a[i+1]-1;
            a[i]=a[i]+10;
        }
        c[i]=a[i]-b[i];
    }
    string s="";
    while(c[len]==0&&len>=0) len--;
    for(int i=0;i<=len;i++)
    {
        s=char(c[i]+'0')+s;
    }
    if(len==-1) s="0";
    return s;
}
int main()
{
    string s1,s2;
    cin>>s1>>s2;
    if(s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2)) f=false;
    if(f) cout<< sub(s1,s2);
    else
    {
        printf("-");
        cout<< sub(s2,s1);
    }
    return 0;
}

**高精度乘法
#include<bits/stdc++.h>
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.size()>1&&C.back()==0)  C.pop_back();
    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');
    auto  C=mul(A,b);
    for(int i=C.size()-1;i>=0;i--) cout<< C[i];
    return 0;
}

** 1271 - 高精度整数除法
** 来源:东方博宜oj   oj.czos.cn

*解法一
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b,i,n,t;
    cin>>a>>b>>n;
    cout<<a/b<< ".";
    t=a%b;
    for(int i=1;i<=n;i++)
    {
        t=t*10;
        cout<<t/b;
        t=t%b;
    }
    return 0;
}

*解法二
#include<bits/stdc++.h>
using namespace std;
string div(int a,int b,int n)
{
    string s=to_string(a/b)+'.';
    int t=a%b;
    for(int i=0;i<n;i++)
    {
        t*=10;
        s+=char(t/b+'0');
        t%=b;
    }
    return s;
}
int main()
{
    int a,b,n;
    cin>>a>>b>>n;
    cout<<div(a,b,n);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值