代码在luoguIDE能运行但是DEV-c++ RE玄关
  • 板块学术版
  • 楼主Crab_Tang
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/4/14 13:50
  • 上次更新2024/4/14 14:29:50
查看原帖
代码在luoguIDE能运行但是DEV-c++ RE玄关
1021365
Crab_Tang楼主2024/4/14 13:50
#include<bits/stdc++.h>
using namespace std;
struct bigint{
    int WIDTH=8;
    int BASE=1e8;
    static const int NUMSIZE=10000;
    int sign;//sign为-1是负数,1是正数
    int len;
    int num[NUMSIZE];
    bigint(){
        len=1,sign=1;
        memset(num,0,sizeof num);
    }
    bigint(string s){
        sign=1,len=ceil(((int)s.length())*1.0/WIDTH);
        bool ____k=(((int)s.length())%WIDTH);
        if(s[0]=='-')
            sign=-1,len=ceil((((int)s.length())-1)*1.0/WIDTH),____k=((((int)s.length())-1)%WIDTH);
        if(____k)
            num[len]=stoi(s.substr(((sign==1)?0:1),((((int)s.length())-(sign==1?0:1))%WIDTH)));
        for(int i=(____k?len-1:len);i>=1;--i)
            num[i]=stoi(s.substr(((int)s.length())-WIDTH*i,WIDTH));
        clear();
    }
    bigint(int x){
    	if(x<0)
    		sign=-1,x=-x;
    	else
    		sign=1;
    	memset(num,0,sizeof num);
    	len=0;
    	do{
    		++len;
    		num[len]=x%BASE;
    		x/=BASE;
		}
		while(x);
        clear();
    }
    bigint(long long x){
    	if(x<0)
    		sign=-1,x=-x;
    	else
    		sign=1;
    	memset(num,0,sizeof num);
    	len=0;
    	do{
    		++len;
    		num[len]=x%BASE;
    		x/=BASE;
		}
		while(x);
        clear();
    }
    int stoi(string s){
        int x=0;
        for(int i=0;i<((int)s.length());++i)
            x=x*10+s[i]-'0';
        return x;//return std::stoi(s);
    }
    void clear(){
        while(len>1&&num[len]==0)
            num[len--]=0;
        if(len==1&&num[len]==0&&sign==-1)
            sign=1;
        return;
    }
    void print(char c=' ',bool mode=0){
        if(!mode){
            if(sign==-1)
                putchar('-');
            printf("%d",num[len]);
            for(int i=len-1;i>=1;--i)
                printf("%08d",num[i]);
            putchar(c);
            return;
        }
        for(int i=1;i<=len;++i)
            cout<<"num,"<<i<<":"<<num[i]<<'\n';
        cout<<"len:"<<len<<" sign:"<<sign;
        puts("");
        return;
    }
    bigint operator-(){
        bigint ans=(*this);
        if(!(ans.len==1&&ans.sign==1&&ans.num[len]==0))
            ans.sign*=-1;
        return ans;
    }
    bigint operator+(bigint x){
        if(x.sign==-1&&sign==1)
            return (*this)-(-x);
        if(sign==-1&&x.sign==1)
            return x-(-(*this));
        bigint ans;
        if(sign==-1&&x.sign==-1)
            ans.sign=-1;
        ans.len=max(len,x.len)+1;
        for(int i=1;i<=ans.len;++i){
            ans.num[i]+=num[i]+x.num[i];
            ans.num[i+1]=ans.num[i]/BASE;
            ans.num[i]=ans.num[i]%BASE;
        }
        ans.clear();
        return ans;
    }
    int cmp_bigint(bigint x,bigint y){//1代表等于,2代表小于,3代表大于
        if(x.sign<y.sign)//x负y正
            return 2;
        if(x.sign>y.sign)//x正y负
            return 3;
        if(x.sign==-1){//都是负
            if(x.len>y.len)//x长y短
                return 2;
            if(x.len<y.len)//y长x短
                return 3;
            for(int i=x.len;i>=1;--i){
                if(x.num[i]>y.num[i])
                    return 2;
                if(x.num[i]<y.num[i])
                    return 3;
            }
            return 1;
        }
        if(x.sign==1){//都是正
            if(x.len>y.len)//x长y短
                return 3;
            if(x.len<y.len)//y长x短
                return 2;
            for(int i=x.len;i>=1;--i){
                if(x.num[i]>y.num[i])
                    return 3;
                if(x.num[i]<y.num[i])
                    return 2;
            }
            return 1;
        }
        throw invalid_argument("cmp_bigint wrong");
    }
    bool operator<(bigint x){
        return cmp_bigint((*this),x)==2;
    }
    bool operator>(bigint x){
        return cmp_bigint((*this),x)==3;
    }
    bool operator==(bigint x){
        return cmp_bigint((*this),x)==1;
    }
    bigint operator-(bigint x){
        if(x.sign==-1)
            return (*this)+(-x);
        if(sign==-1)
            return (*this)+(-x);
        if((*this)<x)
            return -(x-(*this));
        bigint ans;
        ans.len=len;
        for(int i=1;i<=ans.len;++i){
            ans.num[i]+=num[i]-x.num[i]+BASE;
            ans.num[i+1]=ans.num[i]/BASE-1;
            ans.num[i]%=BASE;
        }
        ans.clear();
        return ans;
    }
    bigint operator*(bigint x){
    	
    	if(x==1)
    		return (*this);
    	puts("111");
    	if((*this)==1)
    		return x;
    	puts("111");
    	if(x==0||(*this)==0)
    		return 0;
    	puts("111");
    	
    	bigint ans;
    	ans.len=len+x.len;
    	if((x.sign==-1&&sign==1)||(sign==-1&&x.sign==1))
    		ans.sign=-1;
    	long long tmp_ans[NUMSIZE*NUMSIZE];
    	for(int i=1;i<=len;++i)
    		for(int j=1;j<=x.len;++j){
    			tmp_ans[i+j-1]+=num[i]*x.num[i];
    			tmp_ans[i+j]+=tmp_ans[i+j-1]/BASE;
    			tmp_ans[i+j-1]%=BASE;
			}
    	for(int i=1;i<=ans.len;++i)
    		ans.num[i]=tmp_ans[i];
    	ans.clear();
    	return ans;
	}
	
};
int main(){
	
    string sa,sb;
    cin>>sa>>sb;
    bigint a=sa,b=sb;
    a=a*b;
    a.print();

    return 0;
}

201行报错的。

是哪里的问题?

2024/4/14 13:50
加载中...