高精度炸了!
  • 板块学术版
  • 楼主Cure_Wing
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/10/10 19:01
  • 上次更新2023/11/4 04:08:36
查看原帖
高精度炸了!
394167
Cure_Wing楼主2021/10/10 19:01

求助,自己写的高精除和高精模炸掉了!!!(キ`゚Д゚´)!!,具体是怎么回事?

#include<bits/stdc++.h>
#define maxn 50001
using namespace std;
int t,n,k;
struct Bigint{
    int len,a[maxn],op;
    char s[maxn];
    Bigint(int x=0){
        memset(a,0,sizeof(a));
        if(x<0) op=-1,x=-x;
        for(len=1;x;++len)
            a[len]=x%10,x/=10;
        len--;
        strcpy(s,""); 
    }
    int &operator[](int i){
        return a[i];
    }
    void flatten(int L){
        len=L;
        for(int i=1;i<=len;++i)
            a[i+1]+=a[i]/10,a[i]%=10;
        for(;!a[len]&&len>1;)
            --len;
        if(a[len]==0) op=1;
    }
    void scan(){
        scanf("%s",s);
        len=strlen(s);
        int st=0;
        if(s[0]=='-') op=-1,st=1;
        else op=1;
        for(int i=st;i<len;++i)
            a[len-i]=int(s[i]-'0');
        if(op==-1) --len;
    }
    void print(){
        if(op==-1) printf("-");
        for(int i=max(len,1);i>=1;--i)
            printf("%d",a[i]);
    }
}a(0),b(0),c(0);
Bigint operator+(Bigint a,Bigint b){
    Bigint c;
    int len=max(a.len,b.len);
    for(int i=1;i<=len;++i)
        c[i]+=a[i]+b[i];
    c.flatten(len+1);
    return c;
}
Bigint operator-(Bigint a,Bigint b){
    Bigint c;
    int len=a.len;
    for(int i=1;i<=len;++i){
        if(a[i]<b[i]){
            --a[i+1];
            a[i]+=10;
        }
        c[i]=a[i]-b[i];
    }
    c.flatten(len);
    return c;
}
Bigint operator*(Bigint a,int b){
    Bigint c;
    int len=a.len;
    for(int i=1;i<=len;++i)
        c[i]=a[i]*b;
    c.flatten(len+11);
    return c;
}
Bigint operator*(Bigint a,Bigint b){
    Bigint c;
    for(int i=1;i<=a.len;++i)
        for(int j=1;j<=b.len;++j)
            c[i+j-1]+=a[i]*b[j];
    c.flatten(a.len+b.len);
    return c;
}
Bigint operator/(Bigint a,int b){
    Bigint c;
    int len=a.len,x=0;
    for(int i=len;i;--i){
        c[i]=a[i]+x*10;
        x=c[i]%b;
        c[i]/=b;
    }
    c.flatten(len);
    return c;
}
int operator%(Bigint a,int b){
    Bigint c;
    int len=a.len,x=0;
    for(int i=len;i;--i){
        c[i]=a[i]+x*10;
        x=c[i]%b;
        c[i]/=b;
    }
    return x;
}
bool operator>(Bigint a,Bigint b){
    if(a.len!=b.len) return a.len>b.len;
    int len=a.len;
    for(int i=len;i;--i)
        if(a[i]!=b[i])
            return a[i]>b[i];
    return 0; 
}
bool operator<(Bigint a,Bigint b){
    if(a.len!=b.len) return a.len<b.len;
    int len=a.len;
    for(int i=len;i;--i)
        if(a[i]!=b[i])
            return a[i]<b[i];
    return 0; 
}
bool operator>=(Bigint a,Bigint b){
    if(a.len!=b.len) return a.len>b.len;
    int len=a.len;
    for(int i=len;i;--i)
        if(a[i]!=b[i])
            return a[i]>b[i];
    return 1;
}
bool operator<=(Bigint a,Bigint b){
    if(a.len!=b.len) return a.len<b.len;
    int len=a.len;
    for(int i=len;i;--i)
        if(a[i]!=b[i])
            return a[i]<b[i];
    return 1; 
}
int find(Bigint a,int b){
    int c=0;
    int len=a.len;
    for(int i=1;i<=len;++i)
        c+=a[i]==b;
    return c;
}
Bigint abs(Bigint a){
    Bigint b=a;
    b.op=1;
    return b;
}
Bigint opp(Bigint a){
	Bigint b=a;
	b.op=-b.op;
	return b;
}
Bigint add(Bigint a,Bigint b){
    Bigint c;
    Bigint d=abs(a),e=abs(b);
    if(a.op==b.op) c=d+e,c.op=a.op;
    else if(d>e) c=d-e,c.op=a.op;
    else c=e-d,c.op=b.op;
    return c;
}
Bigint copy(Bigint a,int p,int t){
	Bigint b;
	for(int i=t;i>=p;--i) b[i]=a[i];
	for(int i=p-1;i;--i) b[i]=0;
	b.flatten(t);
	return b;
}
Bigint div(Bigint a,Bigint b){
	Bigint c;
	for(int i=a.len;i;--i){
		Bigint d(0);
		d=copy(a,i,a.len);
		while(a>=d) ++c[i],a=a-d;
	}
	c.flatten(a.len-b.len+1);
	return c;
}
Bigint mod(Bigint a,Bigint b){
	Bigint c;
	for(int i=a.len;i;--i){
		Bigint d(0);
		d=copy(a,i,a.len);
		while(a>=d) ++c[i],a=a-d;
	}
	a.flatten(b.len);
	return a;
}
int main(){
    a.scan(),b.scan();
    c=div(a,b);
    c.print();
    c=mod(a,b);
    c.print();
	return 0;
}

可能是在b.scan()后面,div前面。
在线等......

2021/10/10 19:01
加载中...