高精度,乘法加法

南楼画角 提交于 2020-03-05 22:54:51

#include <cstring>

#include <cstdio>

#include <algorithm>

#include <cmath>

#include <cstdlib>

#include <vector>

#include <iostream>

#define lson rt<<1

#define rson rt<<1|1

using namespace std;

typedef long long ll;

typedef pair<int, int> P;

const int maxn=2e2+10;

struct dashu

{

    int s[maxn*5];

    int flag,len;

    void ini()

    {

        memset(s, 0, sizeof s);

        flag=len=1;

    }

    void pri()

    {

        for(int i=0;i<len;i++)

        {

            printf("%c",s[len-i-1]+'0');

        }

    }

    void jinwei()

    {

        for(int i=0;i<len;i++)

        {

            if(s[i]>9)

            {

                s[i+1]+=s[i]/10;

                s[i]=s[i]%10;

                len=max(i+2,len);

            }

        }

    }

};

bool cmp(dashu d1,dashu d2)

{

    if(d1.flag==1&&d2.flag==1)

    {

        if(d1.len>d2.len)

            return 0;

        else if(d1.len<d2.len)

            return 1;

        else

        {

            int len=d1.len;

            for(int i=0;i<len;i++)

                if(d1.s[len-1-i]<d2.s[len-1-i])

                    return 1;

                else if(d1.s[len-1-i]>d2.s[len-1-i])

                    return 0;

            return 1;

        }

    }

    else if(d1.flag==-1&&d2.flag==-1)

    {

        if(d1.len>d2.len)

            return 1;

        else if(d1.len<d2.len)

            return 0;

        else

        {

            int len=d1.len;

            for(int i=0;i<len;i++)

                if(d1.s[len-1-i]<d2.s[len-1-i])

                    return 0;

                else if(d1.s[len-1-i]>d2.s[len-1-i])

                    return 1;

            return 1;

        }

    }else if(d1.flag==1&&d2.flag==-1)

    {

        return 0;

    }else if(d1.flag==-1&&d2.flag==1)

    {

        return 1;

    }

    return 1;

}

dashu add(dashu d1,dashu d2)

{

    dashu ans;

    ans.ini();

    if((d1.flag==1&&d2.flag==1)||(d1.flag==-1&&d2.flag==-1))

    {

        int len=max(d1.len,d2.len);

        for(int i=0;i<len;i++)

            ans.s[i]=d1.s[i]+d2.s[i];

        ans.len=len;

        ans.flag=d1.flag;

        ans.jinwei();

    }

    return ans;

}

dashu mul(dashu d1,dashu d2)

{

    dashu ans,t;

    ans.ini();

    t.ini();

    ans.flag=d1.flag*d2.flag;

    for(int i=0;i<d1.len;i++)

    {

        int chengzi=d1.s[i];

        t.ini();

        t.len=i+d2.len;

        for(int j=0;j<d2.len;j++)

        {

            t.s[i+j]=chengzi*d2.s[j];

        }

        t.jinwei();

        ans=add(ans, t);

    }

    if(ans.s[ans.len-1]==0)

        d1.pri();

    return ans;

}

dashu zhuanhuan(int n)

{

    dashu t2;

    t2.ini();

    for(int j=0;n!=0;j++)

    {

        t2.s[j]=n%10;

        n/=10;

        t2.len=j+1;

    }

     if(t2.s[t2.len-1]==0)

         cout<<n<<endl;

    return t2;

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!