• P1932 A+B A-B A*B A/B A%B Problem


    题目

    高精度加减乘除模。

    分析

    高精度模板,这里还是压位高精。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #ifndef _INTEGER_HPP_
    #define _INTEGER_HPP_
    
    namespace PsephurusGladius{
        namespace integer{
            const int Max_Integer_Length=1e4;
            char char_array_temp[Max_Integer_Length];
            class Integer{
                private:
                    int digit[Max_Integer_Length],count;
                    short signum;
                public:
                    Integer(void);
                    Integer(const Integer &target);
                    Integer(const long long &target);
                    Integer(const char *target);
                    operator char*(void);
                    void zero(void);
                    friend std::istream& operator >>(std::istream &Cin,Integer &target);
                    friend std::ostream& operator <<(std::ostream &Cout,const Integer &target);
                    Integer absolute_value(void)const;
                    Integer opposite_number(void)const;
                    Integer operator -(void)const;
                    friend bool operator <(const Integer &target1,const Integer &target2);
                    friend bool operator >(const Integer &target1,const Integer &target2);
                    friend bool operator <=(const Integer &target1,const Integer &target2);
                    friend bool operator >=(const Integer &target1,const Integer &target2);
                    friend bool operator ==(const Integer &target1,const Integer &target2);
                    friend bool operator !=(const Integer &target1,const Integer &target2);
                    friend Integer operator +(const Integer &target1,const Integer &target2);
                    friend Integer operator -(const Integer &target1,const Integer &target2);
                    friend Integer operator *(const Integer &target1,const Integer &target2);
                    friend Integer operator /(const Integer &target1,const Integer &target2);
                    friend Integer operator %(const Integer &target1,const Integer &target2);
                    Integer& operator ++(void);
                    Integer operator ++(int);
                    Integer& operator --(void);
                    Integer operator --(int);
                    Integer operator +=(const Integer &target);
                    Integer operator -=(const Integer &target);
                    Integer operator *=(const Integer &target);
                    Integer operator /=(const Integer &target);
                    Integer operator %=(const Integer &target);
            };
            inline Integer::Integer(void):count(0),signum(0){
                memset(digit,0,sizeof(digit));
            }
            inline Integer::Integer(const Integer &target):count(target.count),signum(target.signum){
                memcpy(digit,target.digit,sizeof(digit));
            }
            inline Integer::Integer(const long long &target){
                memset(digit,0,sizeof(digit));
                signum=target<0?-1:(target>0?1:0);
                count=-1;
                long long temp=target;
                do{
                    digit[++count]=temp%10000;
                    temp/=10000;
                }
                while(temp);
            }
            inline Integer::Integer(const char *target){
                memset(digit,0,sizeof(digit));
                int start=0,len=strlen(target);
                if(target[0]=='-'&&(target[1]!='0'||len!=2)){
                    signum=-1;
                    ++start;
                }
                else if(target[0]!='0'||len!=1)signum=1;
                else signum=0;
                count=(len-start-1)/4;
                for(int i=start,sum=0;i<len;++i)
                {
                    sum=sum*10+target[i]-'0';
                    if(!((len-i-1)%4))
                    {
                        digit[count-(i-start)/4]=sum;
                        sum=0;
                    }
                }
                while(count>0&&!digit[count])
                    --count;
            }
            inline Integer::operator char*(void)
            {
                memset(char_array_temp,0,sizeof(char_array_temp));
                for(int i=count,len=0;i>-1;--i)
                {
                    if(i==count)
                    {
                        len+=sprintf(char_array_temp+len,"%d",digit[i]);
                        continue;
                    }
                    len+=sprintf(char_array_temp+len,"%04d",digit[i]);
                }
                return char_array_temp;
            }
            inline void Integer::zero(void)
            {
                memset(digit,0,sizeof(digit));
                count=signum=0;
            }
            inline std::istream& operator >>(std::istream &Cin,Integer &target)
            {
                scanf("%s",char_array_temp);
                target=Integer(char_array_temp);
                return Cin;
            }
            inline std::ostream& operator <<(std::ostream &Cout,const Integer &target)
            {
                if(target.signum==-1)
                    printf("-");
                printf("%d",target.digit[target.count]);
                for(int i=target.count-1;i>-1;--i)
                    printf("%04d",target.digit[i]);
                return Cout;
            }
            inline Integer Integer::absolute_value(void)const
            {
                if(!count&&!signum)
                    return *this;
                else
                {
                    Integer result=*this;
                    result.signum=1;
                    return result;
                }
            }
            inline Integer Integer::opposite_number(void)const
            {
                Integer result=*this;
                result.signum*=-1;
                return result;
            }
            Integer Integer::operator -(void)const
            {
                return opposite_number();
            }
            inline bool operator <(const Integer &target1,const Integer &target2)
            {
                 if(target1.signum!=target2.signum)
                     return target1.signum<target2.signum;
                 if(target1.signum==-1)
                     return target2.absolute_value()<target1.absolute_value();
                if(target1.count!=target2.count)
                     return target1.count<target2.count;
                 for(int i=target1.count;i>-1;--i)
                     if(target1.digit[i]!=target2.digit[i])
                         return target1.digit[i]<target2.digit[i];
                 return false;
            }
            inline bool operator >(const Integer &target1,const Integer &target2)
            {
                return !(target1<target2)&&!(target1==target2);
            }
            inline bool operator ==(const Integer &target1,const Integer &target2)
            {
                if(target1.signum!=target2.signum||target1.count!=target2.count)
                     return false;
                 for(int i=target1.count;i>-1;--i)
                     if(target1.digit[i]!=target2.digit[i])
                         return false;
                 return true;
            }
            inline bool operator <=(const Integer &target1,const Integer &target2)
            {
                return target1<target2||target1==target2;
            }
            inline bool operator >=(const Integer &target1,const Integer &target2)
            {
                return !(target1<target2);
            }
            inline bool operator !=(const Integer &target1,const Integer &target2)
            {
                return !(target1==target2);
            }
            inline Integer operator +(const Integer &target1,const Integer &target2)
            {
                if(target1.signum!=target2.signum)
                    if(!target1.signum||!target2.signum)
                        return target1.signum?target1:target2;
                    else return target1.signum<target2.signum?target2-target1.absolute_value():target1-target2.absolute_value();
                Integer result;
                result.count=target1.count<target2.count?target2.count:target1.count;
                result.signum=target1.signum;
                for(int i=0;i<=result.count;++i)
                {
                    result.digit[i]+=target1.digit[i]+target2.digit[i];
                    result.digit[i+1]=result.digit[i]/10000;
                    result.digit[i]%=10000;
                }
                if(result.digit[result.count+1])
                    ++result.count;
                return result;
            }
            inline Integer operator -(const Integer &target1,const Integer &target2)
            {
                if(target1.signum!=target2.signum)
                    if(!target1.signum||!target2.signum)
                        return target1.signum?target1:target2.opposite_number();
                    else return target1.signum<target2.signum?(target1.absolute_value()+target2).opposite_number():target1+target2.absolute_value();
                if(target1<target2)
                    return (target2-target1).opposite_number();
                Integer result;
                if(target1==target2)
                    return result;
                result.count=target1.count;
                result.signum=1;
                for(int i=0;i<=result.count;++i)
                {
                    result.digit[i]+=target1.digit[i]-target2.digit[i];
                    if(result.digit[i]<0)
                    {
                        --result.digit[i+1];
                        result.digit[i]+=10000;
                    }
                }
                while(result.count>0&&!result.digit[result.count])
                    --result.count;
                return result;
            }
            inline Integer operator *(const Integer &target1,const Integer &target2)
            {
                Integer result;
                if(!target1.signum&&!target2.signum)
                    return result;
                result.signum=target1.signum*target2.signum;
                result.count=target1.count+target2.count+1;
                for(int i=0;i<=target1.count;++i)
                    for(int j=0;j<=target2.count;++j)
                    {
                        result.digit[i+j]+=target1.digit[i]*target2.digit[j];
                        result.digit[i+j+1]+=result.digit[i+j]/10000;
                        result.digit[i+j]%=10000;
                    }
                while(result.count>0&&!result.digit[result.count])
                    --result.count;
                return result;
            }
            inline Integer operator /(const Integer &target1,const Integer &target2)
            {
                Integer result,temp,now;
                if(!target1.signum||target1.absolute_value()<target2.absolute_value())
                    return result;
                if(!target2.signum)
                    throw std::logic_error("divide by zero!");
                result.signum=target1.signum*target2.signum;
                result.count=target1.count;
                now.signum=1;
                for(int i=result.count;i>-1;--i)
                {
                    for(int j=now.count;j>-1;--j)
                        now.digit[j+1]=now.digit[j];
                    now.digit[0]=target1.digit[i];
                    if(now.digit[now.count+1])
                        ++now.count;
                    now.signum=1;
                    if(now<target2)
                        continue;
                    int left=0,right=9999;
                    while(left<right)
                    {
                        int mid=(left+right)/2;
                        if(target2*Integer(mid)<=now)
                            left=mid+1;
                        else
                            right=mid;
                    }
                    result.digit[i]=left-1;
                    now-=Integer(left-1)*target2;
                }
                while(result.count>0&&!result.digit[result.count])
                    --result.count;
                return result;
            }
            inline Integer operator %(const Integer &target1,const Integer &target2)
            {
                return target1-target1/target2*target2;
            }
            inline Integer& Integer::operator ++(void)
            {
                return *this=*this+Integer(1ll);
            }
            inline Integer Integer::operator ++(int)
            {
                Integer result=*this;
                ++*this;
                return result;
            }
            inline Integer& Integer::operator --(void)
            {
                return *this=*this-Integer(1ll);
            }
            inline Integer Integer::operator --(int)
            {
                Integer result=*this;
                --*this;
                return result;
            }
            inline Integer Integer::operator +=(const Integer &target)
            {
                return *this=*this+target;
            }
            inline Integer Integer::operator -=(const Integer &target)
            {
                return *this=*this-target;
            }
            inline Integer Integer::operator *=(const Integer &target)
            {
                return *this=*this*target;
            }
            inline Integer Integer::operator /=(const Integer &target)
            {
                return *this=*this/target;
            }
            inline Integer Integer::operator %=(const Integer &target)
            {
                return *this=*this%target;
            }
        }
    }
    
    #endif
    using namespace PsephurusGladius;
    using namespace integer;
    Integer a,b;
    signed main(){
    	cin>>a>>b;
    	cout<<a+b<<endl<<a-b<<endl<<a*b<<endl<<a/b<<endl<<a%b;
    	return 0;
    }
    
  • 相关阅读:
    ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory
    pycocotools使用教程
    with torch.no_grad() 详解
    虚拟机Ubuntu上下载Pytorch显示超时
    Deep Layer Aggregation DLA网络的结构
    tgz文件解压命令
    install mysql at linux
    devops issue
    process data
    unittest
  • 原文地址:https://www.cnblogs.com/Akmaey/p/15032359.html
Copyright © 2020-2023  润新知