• 高精度运算(运算符重载)


    终于写好了哇,我的亲娘来,满满的都是泪啊。。。重载你妹啊。。。。。

    #include <iostream>
    #include <string.h>
    using namespace std;
    const int Base=1000000000;
    const int Capacity=100;
    typedef long long huge;
    
    struct BigInt
    {
        int Len;
        int Data[Capacity];
        BigInt() : Len(0) {}
        BigInt (const BigInt &V) : Len(V.Len)
        {
            memcpy (Data, V.Data, Len*sizeof*Data);
        }
        BigInt(int V) : Len(0)
        {
            for(; V>0; V/=Base) Data[Len++]=V%Base;
        }
        BigInt &operator=(const BigInt &V)
        {
            Len=V.Len;
            memcpy(Data, V.Data, Len*sizeof*Data);
            return *this;
        }
        int &operator[] (int Index)
        {
            return Data[Index];
        }
        int operator[] (int Index) const
        {
            return Data[Index];
        }
    };
    int compare(const BigInt &A, const BigInt &B)
    {
        if(A.Len!=B.Len) return A.Len>B.Len ? 1:-1;
        int i;
        for(i=A.Len-1; i>=0 && A[i]==B[i]; i--);
        if(i<0)return 0;
        return A[i]>B[i] ? 1:-1;
    }
    
    BigInt operator + (const BigInt &A,const BigInt &B)
    {
        int i,Carry(0);
        BigInt R;
        for(i=0; i<A.Len||i<B.Len||Carry>0; i++)
        {
            if(i<A.Len) Carry+=A[i];
            if(i<B.Len) Carry+=B[i];
            R[i]=Carry%Base;
            Carry/=Base;
        }
        R.Len=i;
        return R;
    }
    
    BigInt operator - (const BigInt &A,const BigInt &B)
    {
        int i,Carry(0);
        BigInt R;
        R.Len=A.Len;
        for(i=0; i<R.Len; i++)
        {
            R[i]=A[i]-Carry;
            if(i<B.Len) R[i]-=B[i];
            if(R[i]<0) Carry=1,R[i]+=Base;
            else Carry=0;
        }
        while(R.Len>0&&R[R.Len-1]==0) R.Len--;
        return R;
    }
    
    BigInt operator * (const BigInt &A,const BigInt &B)
    {
        int i;
        huge Carry(0);
        BigInt R;
        for(i=0; i<A.Len||Carry>0; i++)
        {
            if(i<A.Len) Carry+=huge(A[i])*B[i];
            R[i]=Carry%Base;
            Carry/=Base;
        }
        R.Len=i;
        return R;
    }
    istream &operator>>(istream &In,BigInt &V)
    {
        char Ch;
        for(V=0; In>>Ch;)
        {
            V=V*10+(Ch-'0');
            if(In.peek()<=' ') break;
        }
        return In;
    }
    ostream &operator<<(ostream &Out,const BigInt &V)
    {
        int i;
        Out<<(V.Len==0 ? 0:V[V.Len-1]);
        for(i=V.Len-2; i>=0; i--) for(int j=Base/10; j>0; j/=10) Out<<V[i]/j;
        return Out;
    }
    int main()
    {
        BigInt a,b;
        cin>>a>>b;
        cout<<"+"<<endl;
        cout<<a+b<<endl;
        if(compare(a, b)>0) cout<<"-"<<endl<<a-b<<endl;
        else cout<<"-"<<endl<<b-a<<endl;
        cout<<"*"<<endl<<a*b<<endl;
    }
    


  • 相关阅读:
    【SQL】182. Duplicate Emails
    【SQL】181. Employees Earning More Than Their Managers
    【SQL】180. Consecutive Numbers
    【SQL】178. Rank Scores
    【SQL】177. Nth Highest Salary
    如何处理postman Self-signed SSL certificate blocked错误
    Radio checked 属性
    转成百分比
    内建函数
    队列
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3005956.html
Copyright © 2020-2023  润新知