记录编号 |
372265 |
评测结果 |
AAAAAAAAAA |
题目名称 |
增强的除法问题 |
最终得分 |
100 |
用户昵称 |
HeHe |
是否通过 |
通过 |
代码语言 |
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();
}