记录
代码:
#include<iostream>
using namespace std;
int x[10010],y[10010],ans[10010],C[10010],lx,ly,la,t = 0;
void minusx(int *a,int *b,int &lena,int &lenb)
{
for(int i = 1;i <= lenb;++i)
{
a[i] -= b[i];
if(a[i] < 0)
a[i + 1]--,a[i] += 10;
}
if(lena == 1)
return;
while(!a[lena] && lena > 0)
lena--;
if(lena == 0)
lena = 1;
}
void multiply(int *a,int &lena)
{
bool flag = false;
for(int i = 1;i <= lena;++i)
{
a[i] <<= 1;
if(flag)
a[i] |= 1;
if(a[i] > 9)
{
a[i] -= 10;
flag = true;
}
else
flag = false;
}
if(flag)
{
lena++;
a[lena] = 1;
}
}
void divide(int *a,int &lena)
{
int X = 0,Y;
for(int i = lena;i >= 1;--i)
{
if(a[i] & 1)
{
ans[i] = (X * 10 + a[i]) >> 1;
X = (X * 10 + a[i]) - (((X * 10 + a[i]) >> 1) << 1);
}
else
{
ans[i] = (X * 10 + a[i]) >> 1;
X = 0;
}
}
for(int i = lena;i >= 1;--i)
{
if(ans[i] == 0)
lena--;
else
break;
}
if(lena == 0)
lena++;
for(int i = 1;i <= lena;++i)
a[i] = ans[i];
}
void give(int *x,int *y,int &lena,int &lenb)
{
lena = lenb;
for(int i = 1;i <= lena;++i)
x[i] = y[i];
}
bool check(int *x,int *y,int &lena,int &lenb)
{
if(lena < lenb)
return false;
if(lena > lenb)
return true;
for(int i = lena;i >= 1;--i)
{
if(x[i] > y[i])
return true;
if(x[i] < y[i])
return false;
}
return true;
}
int main()
{
string a,b;
cin >> a >> b;
lx = a.size();
ly = b.size();
la = 1;
for(int i = lx - 1;i >= 0;--i)
x[lx - i] = a[i] - '0';
for(int i = ly - 1;i >= 0;--i)
y[ly - i] = b[i] - '0';
ans[1] = 1;
while(!((lx == 1 && x[1] == 0) || (ly == 1 && y[1] == 0)))
{
if(x[1] % 2 == 0)
{
if(y[1] & 1)
divide(x,lx);
else
{
divide(x,lx);
divide(y,ly);
t++;
}
}
else
{
if(y[1] & 1)
{
if(check(x,y,lx,ly))
minusx(x,y,lx,ly);
else
minusx(y,x,ly,lx);
}
else
divide(y,ly);
}
}
if(check(x,y,lx,ly))
give(ans,x,la,lx);
else
give(ans,y,la,ly);
for(int i = 0;i < t;++i)
multiply(ans,la);
for(int i = la;i >= 1;--i)
cout << ans[i];
return 0;
}