重载运算符——高精度计算+-*

#include <cstdio>
#include <string>
#include<iostream>
#include<algorithm>
#include<cstring>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
struct Data
{
    int a[100001],len;//存储每位数的数组和长度 
    
    Data()//初始值
    {
        memset(a, 0, sizeof(a));
        len = 1;
    }
    
    void read()//读入函数
    {
        char d[100001];
        scanf("%s",d);
        int l=strlen(d);
        for(int i=1; i<=l; i++)
            a[i]=d[l-i]-'0';//倒序存储,方便进位 
        len=l;//记录长度 
    }
    
    void write()//输出函数
    {
        for(int i = len; i>=1; i--)
            printf("%d", a[i]);//倒序输出 
    }
    
    void clean()//去掉前导零 
    {
        while (len>1&&!a[len]) len--;
    }
    
    friend bool operator < (const Data &A,const Data & B)//可以定义在外,外面请不要加friend;在内部不加friend,不能用两个参数 
    {//const防止你改值,别忘了取地址 & 
        if(A.len>B.len) return 0; //先比长度
        if(A.len<B.len) return 1;
        for(int i=1;i<=A.len;i++) //再从最高位开始判断
        {
         if(A.a[i]>B.a[i]) return 0;
         if(A.a[i]<B.a[i]) return 1;
        }
        return 0; //如果一样返回零
    }
    
    friend bool operator <= (const Data & A,const Data & B)
    {
        if(A.len>B.len) return 0; 
        if(A.len<B.len) return 1;
        for(int i=1;i<=A.len;i++) 
        {
         if(A.a[i]>B.a[i]) return 0;
         if(A.a[i]<B.a[i]) return 1;
        }
        return 1; //如果一样返回 1
    }
    
    friend bool operator > (const Data & A,const Data & B)
    {
        if(A.len>B.len) return 1; 
        if(A.len<B.len) return 0;
        for(int i=1;i<=A.len;i++) 
        {
         if(A.a[i]>B.a[i]) return 1;
         if(A.a[i]<B.a[i]) return 0;
        }
        return 0;
    }
    
    friend bool operator >= (const Data & A,const Data &B)
    {
        if(A.len>B.len) return 1; 
        if(A.len<B.len) return 0;
        for(int i=1;i<=A.len;i++) 
        {
         if(A.a[i]>B.a[i]) return 1;
         if(A.a[i]<B.a[i]) return 0;
        }
        return 1;
    }
    friend bool operator == (const Data & A,const Data &B)
    {
        if(A.len>B.len) return 0; 
        if(A.len<B.len) return 0;
        for(int i=1;i<=A.len;i++) 
        {
         if(A.a[i]>B.a[i]) return 0;
         if(A.a[i]<B.a[i]) return 0;
        }
        return 1;//长度相等,对应位数相等才相等 
    }

    friend Data operator + (const Data &A,const Data &B)
    {
        Data C;//因为A,B均不可以改值,所以引入C,C长度1,值为0 
        C.len = max(B.len, A.len);//选取A,B长度最大的 
        for(int i = 1 ; i <= C.len; i++)//边界需要注意
        {
            C.a[i] += A.a[i]+B.a[i];//对应位相加 
            if(C.a[i] >= 10)//每十进一 
            {
                C.a[i] -= 10;//由于不会超过10,故用 -=10 代替 %10 效率更高
                C.a[i+1]++;//进位
            }
        }
        if(C.a[C.len+1])//考虑是否会进到B.len的下一位
            C.len++;
        C.clean();//去0,即使长度大了也不要紧 
        return C;
    }
    
    friend Data operator - (const Data &A ,const Data &B)
    {
        Data C;//因为A,B均不可以改值,所以引入C,C长度1,值为0
        if( A > B)
        {
            C.len=A.len;
            for(int i=1;i<=A.len;i++)
                {     
                    C.a[i]+=A.a[i]-B.a[i];
                    if(C.a[i]<0)//借位
                    {C.a[i+1]--;C.a[i]+=10;}
                }
            if(C.a[C.len+1]) C.len++;
            C.clean();
            return C;
        }
        else if(A==B)//防止出现1-1=-0的情况 
        {
            return C;//C的初始长度为1,值为0 
        }
        else if (A<B)
        {
            cout<<'-';
            C.len=B.len;
            for(int i=1;i<=B.len;i++)
            {
                C.a[i]+=B.a[i]-A.a[i];
                if(C.a[i]<0) 
                {C.a[i+1]--;C.a[i]+=10;} 
            }
            if(C.a[C.len+1]) C.len++;
            C.clean();
            return C;
        }
    }
    
    friend Data operator * (const Data &A ,const Data &B)
    {
        Data C;
        C.len=A.len+B.len;//C的长度最大为 A.len+B.len,有时 A.len+B.len-1
        for(int i=1;i<=A.len;i++)
            for(int j=1;j<=B.len;j++)
                {
                    C.a[i+j-1]+=A.a[i]*B.a[j];//相乘结果加在i+j-1上 
                    C.a[i+j]+=C.a[i+j-1]/10;
                    C.a[i+j-1]%=10;
                }
        if(C.a[C.len+1]) 
           C.len++;
        C.clean();
        return C;  
    }
    
};

Data A,B,C;
int main()
{
    A.read();
    B.read();
    C = A+B;
    //C=A-B;
    //C=A*B;
    C.write();
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wzy1744315462/p/12482948.html
今日推荐