当前位置:网站首页>高精度计算

高精度计算

2022-06-22 14:26:00 Stephen_Curry___

高精度计算

(大数加法,大数减法,大数乘法,大数除法)

高精度加法

//高精度加法
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;


string add(string a,string b)
{
    
    string c;
    int t=0;//定义进位
    int i=a.size()-1,j=b.size()-1;
    
    for(;i>=0||j>=0||t!=0;i--,j--)
    {
    
        if(i>=0)t+=a[i]-'0';
        if(j>=0)t+=b[i]-'0';
        c+=t%10+'0';
        t/=10;
    }
    return c;
}


int main()
{
    
    string a,b,c;
    cin>>a>>b;
    c=add(a,b);
    
    for(int i=c.size()-1;i>=0;i--)cout<<c[i];
    return 0;
}

高精度减法

//高精度减法
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

bool cmp(string a,string b)//判断stringa和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;
}

string sub(string a,string b)//高精度减法代码
{
    
    string c;
    int t=0;
    int i=a.size()-1,j=b.size()-1;
    while(i>=0||j>=0)
    {
    
        t=a[i--]-t-'0';
        if(j>=0)t-=b[j--]-'0';
        c+=((t+10)%10+'0');//这里是便捷处理t>=0和t<0两种情况
        if(t<0)t=1;
        else t=0;
    }
    return c;
}


int main()
{
    
    string a,b,c;
    cin>>a>>b;
    int k=1;
    if(cmp(a,b))//分两种情况:a>=b和a<b,下面是前者情况
    {
    
        c=sub(a,b);
        for(int i=c.size()-1;i>=0;i--)
        {
    
            if(c[c.size()-k]=='0'&&i!=0)
            //这里是为了消去前导0,防止出现123-120输出003的情况
            {
    
                k++;
                continue;
            }
            cout<<c[i];
        }
    }
    else
    {
    
        cout<<'-';
        c=sub(b,a);
        for(int i=c.size()-1;i>=0;i--)
        {
    
            if(c[c.size()-k]=='0'&&i!=0)
            //这里也是消去前导0,防止出现120-123输出-003的情况
            {
    
                k++;
                continue;
            }
            cout<<c[i];
        }
    }
}

高精度乘法(大数A*低精度b)

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

string mul(string a,int b)
{
    
    if(a=="0"||b==0)return "0";
    string c;
    int i=a.size()-1,t=0;

    while(i>=0||t)
    {
    
        if(i>=0)t+=(a[i--]-'0')*b;
        c+=t%10;
        t/=10;
    }
    return c;
}


int main()
{
    
    string a,c;
    int b;
    cin>>a>>b;
    c=mul(a,b);

    for(int i=c.size()-1;i>=0;i--)printf("%d",c[i]);
}

大数除法(大数A/低精度b)

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

//A/b c是商 r是余数
string div(string a,int b,int &r)
{
    
    string c;
    r=0;

    for(int i=0;i<a.size();i++)
    {
    
        r=r*10+a[i]-'0';
        c+=r/b+'0';
        r%=b;
    }
    return c;
}


int main()
{
    
    string a,c;
    int b,r;
    cin>>a>>b;
    c=div(a,b,r);
    int k=0;

    for(int i=0;i<c.size();i++)
    {
    
        if(c[k]=='0'&&i!=c.size()-1)//除去输出前导0的情况
        {
    
            k++;
            continue;
        }
        cout<<c[i];
    };
    cout<<endl<<r;
    return 0;
}

如果内容中存在问题还请各位大佬不吝赐教orn。

原网站

版权声明
本文为[Stephen_Curry___]所创,转载请带上原文链接,感谢
https://blog.csdn.net/stephen_curry___/article/details/122830065