A / B problem
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 24 Accepted Submission(s) : 7
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A / B.
Input
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line consists of two positive integers, A and B. Notice that the integers are very large, that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000.
Output
For each test case, you should output the result of A/B.
Sample Input
1 2 1
Sample Output
2
#include<iostream>
#include<sstream>#include<cstring>
#include<algorithm>
#define maxn 3600
using namespace std;
struct bign
{
int len,s[maxn];
bign()
{
memset(s,0,sizeof(s));
len=1;
}
bign(int num) {*this=num;}
bign(const char* num){*this=num;}
bign operator = (int num)
{
char s[maxn];
sprintf(s,"%d",num);
*this=s;
return *this;
}
bign operator = (const char* num)
{
len=strlen(num);
int i;
for(i=0;i<len;i++) s[i]=num[len-i-1]-'0';
return *this;
}
string str() const
{
string res = "";
int i;
for(i=0;i<len;i++) res=(char)(s[i]+'0')+res;
if(res=="") res="0";
return res;
}
void clean() {while(len>1&&!s[len-1]) len--;}
bign operator + (const bign& b) const
{
bign c; c.len=0;
int i,g;
int max=len>b.len?len:b.len;
for(i=0,g=0;g||i<max;i++)
{
int x=g;
if(i<len) x+=s[i];
if(i<b.len) x+=b.s[i];
c.s[c.len++]=x%10;
g=x/10;
}
return c;
}
bign operator * (int num)
{
bign c; c.len=len+25;
int i,j=0;
for(i=0;i<c.len;i++)
{
c.s[i]=(s[i]*num+j)%10;
j=(s[i]*num+j)/10;
}
c.clean();
return c;
}
bign operator * (const bign& b)
{
bign c; c.len=len+b.len;
int i,j;
for(i=0;i<len;i++) for(j=0;j<b.len;j++) c.s[i+j]+=s[i]*b.s[j];
for(i=0;i<c.len-1;i++)
{
c.s[i+1]+=c.s[i]/10;
c.s[i]%=10;
}
c.clean();
return c;
}
bign operator - (const bign& b)
{
bign c; c.len=0;
int i,g=0;
for(i=0;i<len;i++)
{
int x=s[i]-g;
if(i<b.len) x-=b.s[i];
if(x>=0) g=0;
else {g=1; x+=10;}
c.s[c.len++]=x;
}
c.clean();
return c;
}
bool operator < (const bign& b) const
{
if(len!=b.len) return len<b.len;
int i;
for(i=len-1;i>=0;i--)
if(s[i]!=b.s[i]) return s[i]<b.s[i];
return false;
}
bool operator > (const bign& b) const{return b<*this;}
bool operator <= (const bign& b) {return !(*this>b);}
bool operator >= (const bign& b) {return !(*this<b);}
bool operator == (const bign& b) {return !(b<*this)&&!(*this<b);}
bign operator += (const bign& b) {*this=*this+b; return *this;}
bign operator << (int& n)
{
if(*this==0||n==0) return *this;
bign t=*this;
int i=t.len-1;
t.len+=n;
int *p=t.s;
for(;i>=0;i--) p[i+n]=p[i], p[i]=0;
for(i=0;i<n;i++) p[i]=0;
return t;
}
bign operator / (bign b)
{
bign ans=0,big=*this,add,chu;
bign one=1;
int t;
while(big>=b)
{
t=big.len-b.len;
chu=b<<t;
if(chu>big) chu=b<<(--t);
add=one<<t;
while(chu<=big)
{
big=big-chu;
ans+=add;
}
}
return ans;
}
};
istream& operator >> (istream &in, bign& x)
{
string s;
in >> s;
x = s.c_str();
return in;
}
ostream& operator << (ostream &out, const bign& x)
{
out << x.str();
return out;
}
int main ()
{ int n;
bign a,b;
cin>>n;
while(n--)
{
cin>>a>>b;
cout<<a/b<<endl;
}
return 0;
}