1 条题解

  • 0
    @ 2024-11-6 23:07:38
    注意“”及正负号的判定\huge{注意“-”及正负号的判定}
    #include<iostream>
    #include<cstring>
    using namespace std;
    string s1,s2;
    string add(string s1,string s2){//加法
        long long a[10010]={},b[10010]={},c[10010]={};
        long long la=s1.length(),lb=s2.length(),lc=max(la,lb),x=0;
        string ans="";
        for(int i=0;i<la;i++)a[i]=s1[la-i-1]-'0';
        for(int i=0;i<lb;i++)b[i]=s2[lb-i-1]-'0';
        for(int i=0;i<lc;i++){
            c[i]=a[i]+b[i]+x;
            x=c[i]/10;
            c[i]=c[i]%10;
        }
        if(x)c[lc++]=1;
        for(int i=lc-1;i>=0;i--)ans+=(c[i]+'0');
        return ans;
    }
    string sub(string s1,string s2){//减法
        long long a[10010]={},b[10010]={},c[10010]={};
        long long la=s1.length(),lb=s2.length(),lc=max(la,lb),x=0,f=0;
        string ans="";
        if((s1 < s2 && s1.length() == s2.length()) || s1.length() < s2.length()){
            f=1;
            string t=s1;
            s1=s2;
            s2=t;
            swap(la,lb);
            cout<<'-';
        }
        for(int i=0;i<la;i++)a[i]=s1[la-i-1]-'0';
        for(int i=0;i<lb;i++)b[i]=s2[lb-i-1]-'0';
        for(int i=0;i<lc;i++){
            c[i]=a[i]-b[i]-x;
            if(c[i]<0){
                x=1;
                c[i]+=10;
            }else x=0;
        }
        while(c[lc-1]==0&&lc>1)lc--;
        for(int i=lc-1;i>=0;i--)ans+=(c[i]+'0');
        return ans;
    }
    string mul(string s1,string s2){//乘法
        long long a[10010]={},b[10010]={},c[20010]={};
        long long la=s1.length();
        long long lb=s2.length();
        long long lc=la+lb;
        string ans="";
        for(int i=0;i<la;i++) a[i]=s1[la-1-i]-'0';
        for(int i=0;i<lb;i++) b[i]=s2[lb-1-i]-'0';
        for(int i=0;i<la;i++){ 
            for(int j=0;j<lb;j++){
                c[i+j]+=a[i]*b[j];
                c[i+j+1]+=c[i+j]/10;
                c[i+j]%=10;
            }
        }
        while(c[lc-1]==0&&lc>1){
            lc--;
        }
        for(int i=lc-1;i>=0;i--) ans+=(c[i]+'0');
        return ans;
    }
    string div(string s,int b){//高精除低精
        int n,a[101000],c[101000],la,lc;
        la=s.length(),lc=0;
        for(int i=0;i<la;i++)a[i]=s[i]-'0';
        long long x=0;
        string ans="";
        for(int i=0;i<la;i++){
            c[i]=(x*10+a[i])/b;
            x=(x*10+a[i])%b;
        }
        while(c[lc]==0&&lc+1<la) lc++;
        for(int i=lc;i<la;i++)ans+=(c[i]+'0');
        return ans;
    }
    //高精除高精忒麻烦了懒得写
    int main(){
    	freopen("mark.in","r",stdin);
    	freopen("mark.out","w",stdout);
        bool n1=0,n2=0;
    	char f;
    	cin>>f>>s1>>s2;
    	if(s1[0]=='-'){s1.erase(0,1);n1=1;}
    	if(s2[0]=='-'){s2.erase(0,1);n2=1;}
    	if(f=='*'){if(n1+n2==1)cout<<"-";
    	cout<<mul(s1,s2);}
    	if(f=='+'){
    	            if(n1==0&n2)cout<<sub(s1,s2);
    	            else {if(n1+n2==2)cout<<"-";
    	             cout<<add(s1,s2);
    				}}
    	if(f=='-'){ if(n1&&n2==0){cout<<"-"<<add(s1,s2);}
    			        else if(n1&&n2)cout<<sub(s2,s1);
    		                 else cout<<sub(s1,s2);}
    	return 0;
    }
    
    
    • 1

    信息

    ID
    498
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    120
    已通过
    9
    上传者