高精算数
查看原帖
高精算数
1125006
D5SY_GuoJunning楼主2024/11/20 18:38

高精算数

#include<bits/stdc++.h>
using namespace std;
string a,b,ys;
bool compare(string _a,string _b)
{
    if(_a.size()>_b.size())return true;
    else if(_a.size()<_b.size())return false;
    for(int i=0;i<_a.size();i++)
    {
        if(_a[i]>_b[i])return true;
        else if(_a[i]<_b[i])return false;
    }
    return true;
}
string sum(string _a,string _b)
{
    int al=_a.size(),bl=_b.size(),t=0;
    int mxl=max(al,bl);
    string ans="";
    if(al>bl)
    {
        for(int i=0;i<al-bl;i++)
            _b='0'+_b;
    }
    else if(al<bl)
    {
        for(int i=0;i<bl-al;i++)
            _a='0'+_a;
    }
    for(int i=mxl-1;i>=0;i--)
    {
        char x=(((_a[i]-'0')+(_b[i]-'0')+t)%10)+'0';
        ans=x+ans;
        if(((_a[i]-'0')+(_b[i]-'0')+t)>=10)
            t=1;
        else t=0;
    }
    if(t==1)ans="1"+ans;
    return ans;
}
string subtraction(string _a,string _b)
{
    string fh="";
    if(compare(_a,_b)==false)
    {
        string p=_a;
        _a=_b;
        _b=p;
        fh="-";
    }
    int al=_a.size(),bl=_b.size();
    int mxl=max(al,bl);
    string ans="";
    for(int i=0;i<al-bl;i++)
        _b='0'+_b;
    for(int i=mxl-1;i>=0;i--)
    {
        ans=(char)((((_a[i]-'0')+(int)(_a[i]<_b[i])*10)-(_b[i]-'0'))+'0')+ans;
        if(_a[i]<_b[i])
        {
            _a[i-1]-=1;
            if(_a[i]<'0')_a[i]='9';
        }
    }
    int j=ans.size();
    for(int i=0;i<j-1;i++)
    {
        if(ans[0]!='0')
            break;
        ans.erase(0,1);
    }
    ans=fh+ans;
    return ans;
}
string time_(string _a,string _b)
{
    int al=_a.size(),bl=_b.size(),t=0;
    string ans="0";
    int cnt=0;
    for(int i=bl-1;i>=0;i--)
    {
        string n="";
        for(int j=al-1;j>=0;j--)
        {
            n=(char)(((_a[j]-'0')*(_b[i]-'0')+t)%10+'0')+n;
            t=((_a[j]-'0')*(_b[i]-'0')+t)/10;
        }
        n=(char)(t+'0')+n;
        t=0;
        for(int j=0;j<cnt;j++)
            n=n+'0';
        cnt++;
        ans=sum(ans,n);
    }
    int j=ans.size();
    for(int i=0;i<j-1;i++)
    {
        if(ans[0]!='0')
            break;
        ans.erase(0,1);
    }
    return ans;
}
string divides_(string _a,string _b)
{
    string ans="";
    if(compare(_a,_b)==false)
    {
        ys=_a;
        return "0";
    }
    string cp="";
    cp=_a.substr(0,_b.size()-1);
    for(int i=_b.size()-1;i<_a.size();i++)
    {
        cp=cp+_a[i];
        int j;
        if(compare(cp,b)==false)
        {
            ans=ans+'0';
            if(i==_a.size()-1)ys=cp;
            continue;
        }
        for(j=1;;j++)
        {
            if(compare(subtraction(cp,_b),_b)==false||subtraction(cp,_b)=="0")break;
            cp=subtraction(cp,_b);
        }
        cp=subtraction(cp,_b);
        ans=ans+(char)(j+'0');
        if(i==_a.size()-1)ys=cp;
        if(cp[0]=='0')cp.erase(0,1);
    }
    int j=ans.size();
    for(int i=0;i<j-1;i++)
    {
        if(ans[0]!='0')
            break;
        ans.erase(0,1);
    }
    j=ys.size();
    for(int i=0;i<j-1;i++)
    {
        if(ys[0]!='0')
            break;
        ys.erase(0,1);
    }
    return ans;
}
int main()
{
    cin>>a>>b;
    cout<<sum(a,b)<<endl;
    cout<<subtraction(a,b)<<endl;
    cout<<time_(a,b)<<endl;
    cout<<divides_(a,b)<<endl;
    cout<<ys;
    return 0;
}
2024/11/20 18:38
加载中...