记录编号 372265 评测结果 AAAAAAAAAA
题目名称 增强的除法问题 最终得分 100
用户昵称 GravatarHeHe 是否通过 通过
代码语言 C++ 运行时间 0.050 s
提交时间 2017-02-18 08:44:07 内存使用 0.46 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
//#define LOCAL
#define MAXN 20000
#define is_num(tmp) (tmp<='9'&tmp>='0')
class Bignum{
private:
	int s[MAXN];
	int len;
	void swap()
	{
		int i(0),j(len-1);
		int tmp;
		while(i<j)
		{
			tmp=s[i];
			s[i]=s[j];
			s[j]=tmp;
			i++,j--;
		}
		return ;
	}
	void clear()
	{
		memset(s,0,sizeof(s));
		len=1;return ;
	}
	void copy_1(Bignum&a,int l,int r)//a 复制到 *this 
	{
		clear();
		if(l>r)return ;
		len=0;
		for(int i(l);i<r;++i)
		{
			s[len]=a.s[i];
			a.s[i]=0;
			++len;
		}
		a.len=l;
		return ;
	}
	void copy_2(Bignum&a)//*this 复制到 a 
	{
		for(int i(0);i<len;++i)
		{
			a.s[a.len]=s[i];
			++a.len;
		}
		while(!a.s[a.len-1])--a.len;
		clear();
		return ;
	}
/*	len=10	l=6
		/---------\
		a	      b
0 1 2 3 4 5 6 7 8 9
3 7 6 4 2 8 5 6 9 3
*/
	int div_1(Bignum a,const Bignum&b)
	{
		clear();
		int ans(0);
		if(a<b)
		{
			*this=a;
			goto END;
		}
		for(int i(1);i<=9;++i)
		{
			a-=b;
			if(a<b)
			{
				*this=a; 
				ans=i;
				goto END;
			}
		}
END:	return ans;
	}
public:
	Bignum()
	{
		memset(s,0,sizeof(s));
		len=1;
	}
	Bignum operator=(int num)
	{
		clear();
		if(!num)return *this;
		len=0;
		while(num)
		{
			s[len]=num%10;
			++len;
			num/=10;
		}
		return *this;
	}
	Bignum operator+(const Bignum&a)
	{
		Bignum b;
		b.len=max(a.len,len)+1;
		for(int i(0);i<b.len;++i)
		{
			b.s[i]+=s[i]+a.s[i];
			b.s[i+1]=b.s[i]/10;
			b.s[i]%=10;
		}
		if(!b.s[b.len-1])--b.len;
		return b;
	}
	Bignum operator-(const Bignum&a)
	{
		Bignum b;
		b.len=max(len,a.len);
		for(int i(0);i<b.len;++i)
		{
			b.s[i]+=(s[i]-a.s[i]);
			if(b.s[i]<0)
			{
				b.s[i]+=10;
				b.s[i+1]-=1;
			}
		}
		while(!b.s[b.len-1]&&b.len>1)--b.len;
		return b;
	}
	Bignum operator*(const Bignum&a)
	{
		Bignum b;
		if(s[0]==0&&len==1&&a.s[0]==0&&a.len==1)return b;
		b.len=a.len+len;
		for(int i(0);i<len;++i)
			for(int j(0);j<a.len;++j)
			{
		  		b.s[i+j]+=s[i]*a.s[j];
		  		b.s[i+j+1]+=b.s[i+j]/10;
		  		b.s[i+j]%=10;
			}
		if(!b.s[b.len-1])--b.len;
		return b;
	}
	Bignum operator/(const Bignum&a)
	{
		Bignum res;
		if(*this<a)return res;
		Bignum tmp(*this);
		Bignum tmp_1;
		res.len=tmp.len-a.len+1;
		int tmp_2;
		for(int i(res.len-1);i>=0;--i)//i为复制的位置 
		{
			if(tmp.len-i<a.len)continue;
			tmp_1.copy_1(tmp,i,tmp.len);
			tmp_2=tmp_1.div_1(tmp_1,a);
			tmp_1.copy_2(tmp);
			res.s[i]=tmp_2;
		}
		while(!res.s[res.len-1])--res.len;
		return res;
	}
	Bignum operator+=(const Bignum&a)
	{
		*this=*this+a;
		return *this;
	}
	Bignum operator-=(const Bignum&a)
	{
		*this=*this-a;
		return *this;
	}
	Bignum operator*=(const Bignum&a)
	{
		*this=*this*a;
		return *this;
	}
	Bignum operator/=(const Bignum&a)
	{
		*this=*this/a;
		return *this;
	}
	bool operator<(const Bignum&a)const
	{
		if(len!=a.len)return len<a.len;
		for(int i(len-1);i>=0;--i)
		  if(s[i]!=a.s[i])return s[i]<a.s[i];
		return 0;
	}
	bool operator>(const Bignum&a)const
	{
		return a<*this;
	}
	bool operator<=(const Bignum&a)const
	{
		return !(a<*this);
	}
	bool operator>=(const Bignum&a)const
	{
		return !(*this<a);
	}
	bool operator==(const Bignum&a)const
	{
		if(len!=a.len)return 0;
		for(int i=len-1;i>=0;--i)
		  if(s[i]!=a.s[i])return 0;
		return 1;
	}
	bool operator!=(const Bignum&a)const
	{
		return !(*this==a);
	}
	void read()
	{
		char tmp(getchar());
		len=0;
		while(!is_num(tmp))tmp=getchar();
		while(is_num(tmp))
		  s[len]=tmp^48,++len,tmp=getchar();
		swap();
		return ;
	}
	void print()
	{
		for(int i(len-1);i>=0;--i)
		  putchar(s[i]+'0');
		return ;
	}
}a,b;
int main()
{
#ifndef LOCAL
	freopen("div.in","r",stdin);
	freopen("div.out","w",stdout);
#endif
	a.read();
	b.read();
	(a/b).print();
}