为什么有三个点WA,输入没输入完???
查看原帖
为什么有三个点WA,输入没输入完???
194093
天梦楼主2020/5/9 12:20

谁能告诉我为什么输入没输入完,三个点WA。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<deque>
#define dd double
#define ll long long
#define N 10010
using namespace std;

struct bignum{
	
	ll n[N>>2];
    bool op=0;//1 +,0 -
    const ll mod=1e8;
	
	void out()
	{
        if(!op&&(n[1]||n[0]!=1)) cout<<"-",op=0;
        printf("%lld",n[n[0]]);
        for(int i=n[0]-1;i>0;i--) printf("%08lld",n[i]);
        cout<<endl;
    }//over
    
    void ry()
    {
    	for(int i=n[0];i;--i)
    	{
    		if((n[i]&1)&&i>1) n[i-1]+=mod;
    		n[i]>>=1;
		}
		if(!n[n[0]]&&n[0]>1) --n[0];
	}
    
    void ly()
    {
    	++n[0];
    	for(int i=1;i<=n[0];i++)
    	{
    		n[i]<<=1;
    		if(n[i-1]>=mod) n[i-1]-=mod,++n[i];
		}
		if(!n[n[0]]&&n[0]>1) --n[0];
	}
    
    void cpy(bignum a)
    {
    	for(int i=a.n[0];i>n[0];i--) n[i]=0;
    	for(int i=0;i<=a.n[0];i++) n[i]=a.n[i];
    	op=a.op;
	}
    
    int cmp(bignum a)
    {
    	if(n[0]>a.n[0]) return 1;
    	if(n[0]<a.n[0]) return -1;
    	for(int i=n[0];i;i--)
    	{
    		if(n[i]>a.n[i]) return 1;
    		if(n[i]<a.n[i]) return -1;
		}
		return 0;
	}
    
    void init()
    {
    	string ss;
    	cin>>ss;
    	if(ss[0]=='-') ss[0]='0',op=0;
    	int len=ss.length();
    	for(int i=len-1;i>=0;i-=8)
    	{
    		ll pw=1;
    		for(int j=i;j>i-8&&j>=0;j--)
    		{
    			n[n[0]]+=(ss[j]^48)*pw;
    			pw=(pw<<3)+(pw<<1);
			}
			++n[0];
		}
		n[0]--;
	}
	
	void sp(bignum& b)
	{
		bignum c;
		c.cpy(*this);
		this->cpy(b);
		b.cpy(c);
	}
	
	bignum ()
	{
		memset(n,0,sizeof(n));
		op=1;
		n[0]=1;
	}
	
	bignum operator + (bignum b)// a>0 b>0
	{
		bignum c;
		if(op==b.op) c.op=op;
		else
		{
			if(op==1)
			{
				b.op=1;
				return *this-b;
			}
			else
			{
				op=1;
				return b-*this;
			}
		}
		c.n[0]=max(n[0],b.n[0])+1;
		for(int i=1;i<=c.n[0];i++)
		{
			c.n[i]+=n[i]+b.n[i];
			if(c.n[i]>=mod) c.n[i]-=mod,c.n[i+1]++;
		}
		while(!c.n[c.n[0]]&&c.n[0]>1) c.n[0]--;
		return c;
	}
	
	bignum operator - (bignum b) //a>b>0
	{
		bignum c,d;
		d.cpy(*this);
		if(op!=b.op)
		{
			b.op^=1;
			return *this+b;
		}
		else c.op=op;
		if(this->cmp(b)==-1)
		{
			this->sp(b);
			c.op^=1;
		}
		c.n[0]=max(n[0],b.n[0]);
		for(int i=1;i<=c.n[0];i++)
		{
			c.n[i]+=n[i]-b.n[i];
			if(c.n[i]<0) c.n[i]+=mod,c.n[i+1]--;
		}
		while(!c.n[c.n[0]]&&c.n[0]>1) c.n[0]--;
		this->cpy(d);
		return c;
	}
	
	bignum operator * (bignum b)
	{
		bignum c;
		c.n[0]=n[0]+b.n[0];
		for(int i=1;i<=n[0];i++)
		{
			for(int j=1;j<=b.n[0];j++)
			{
				c.n[i+j-1]+=n[i]*b.n[j];
				if(c.n[i+j-1]>=mod) c.n[i+j]+=c.n[i+j-1]/mod,c.n[i+j-1]%=mod;
			}
		}
		while(!c.n[c.n[0]]&&c.n[0]>1) c.n[0]--;
		if(op!=b.op) c.op=0;
		return c;
	}
	
	bignum operator / (bignum b)
	{
		bignum cp,lt,c,d;
		d.cpy(*this);
		if(op!=b.op) lt.op=0;
		cp.n[1]=1;
		while(this->cmp(b)!=-1) b.ly(),cp.ly();
		while(cp.n[1]||cp.n[0]>1)
		{
			if(this->cmp(b)!=-1)
			{
				c.cpy(*this-b);
				this->cpy(c);
				c.cpy(lt+cp);
				lt.cpy(c);
			}
			b.ry();
			cp.ry();
		}
		lt.out();
		lt.cpy(*this);
		this->cpy(d);
		return lt;
	}
	
};

int main()
{
	bignum a,b,c;
	a.init();
	b.init();
	
	cout<<endl;
	cout<<endl;
	c.cpy(a+b);
	c.out();
	c.cpy(a-b);
	c.out();
	c.cpy(a*b);
	c.out();
	c.cpy(a/b);
	c.out();
}
2020/5/9 12:20
加载中...