Pagini recente » Cod sursa (job #1776081) | Cod sursa (job #1530942) | Cod sursa (job #489113) | Cod sursa (job #1624301) | Cod sursa (job #1783421)
#include <bits/stdc++.h>
#define NMax 1000000
typedef char Huge[NMax+3];
Huge A,D, R, C, UNU;
using namespace std;
//ifstream fin("next.in");
ofstream fout("next.out");
int Sgn(Huge H1, Huge H2) {
// Elimina zero-urile semnificative, daca exista.
while (H1[0] && !H1[H1[0]]) H1[0]--;
while (H2[0] && !H2[H2[0]]) H2[0]--;
if (H1[0] < H2[0]) {
return -1;
} else if (H1[0] > H2[0]) {
return +1;
}
for (int i = H1[0]; i > 0; --i) {
if (H1[i] < H2[i]) {
return -1;
} else if (H1[i] > H2[i]) {
return +1;
}
}
return 0;
}
void Subtract(Huge A, Huge B)
/* A <- A-B */
{ int i, T=0;
for (i=B[0]+1;i<=A[0];) B[i++]=0;
for (i=1;i<=A[0];i++)
A[i]+= (T=(A[i]-=B[i]+T)<0) ? 10 : 0;
/* Adica A[i]=A[i]-(B[i]+T);
if (A[i]<0) T=1; else T=0;
if (T) A[i]+=10; */
while (!A[A[0]] && A[0])
A[0]--;
}
void Shl(Huge H, int Count)
/* H <- H*10ACount */
{
/* Shifteaza vectorul cu Count pozitii */
memmove(&H[Count+1],&H[1],sizeof(int)*H[0]);
/* Umple primele Count pozitii cu 0 */
memset(&H[1],0,sizeof(int)*Count);
/* Incrementeaza numarul de cifre */
H[0]+=Count;
}
void Shl2(Huge H, int Count)
/* H <- H*10ACount */
{ int i;
/* Shifteaza vectorul cu Count pozitii */
for (i=H[0];i;i--)
H[i+Count]=H[i];
/* Umple primele Count pozitii cu 0 */
for (i=1;i<=Count;) H[i++]=0;
/* Incrementeaza numarul de cifre */
H[0]+=Count;
}
void Shr(Huge H, int Count)
/* H <- H/10ACount */
{
/* Shifteaza vectorul cu Count pozitii */
memmove(&H[1],&H[Count+1],sizeof(int)*(H[0]-Count));
/* Decrementeaza numarul de cifre */
H[0]-=Count;
}
void Shr2(Huge H, int Count)
/* H <- H/10ACount */
{ int i;
/* Shifteaza vectorul cu Count pozitii */
for (i=Count+1;i<=H[0];i++) H[i-Count]=H[i];
/* Decrementeaza numarul de cifre */
H[0]-=Count;
}
void DivideHuge(Huge A, Huge B, Huge C, Huge R)
/* A/B = C rest R */
{ int i;
R[0]=0;C[0]=A[0];
for (i=A[0];i;i--)
{ Shl2(R,1);R[1]=A[i];
C[i]=0;
while (Sgn(B,R)!=1)
{ C[i]++;
Subtract(R,B);
}
}
while (!C[C[0]] && C[0]>1) C[0]--;
}
void MultHuge(Huge A, Huge B, Huge C)
/* C <- A x B */
{ int i,j,T=0;
C[0]=A[0]+B[0]-1;
for (i=1;i<=A[0]+B[0];) C[i++]=0;
for (i=1;i<=A[0];i++)
for (j=1;j<=B[0];j++)
C[i+j-1]+=A[i]*B[j];
for (i=1;i<=C[0];i++)
{ T=(C[i]+=T)/10;
C[i]%=10;
}
if (T) C[++C[0]]=T;
}
unsigned long Mod(Huge A, unsigned long X)
/* Intoarce A%X */
{ int i;
unsigned long R=0;
for (i=A[0];i;i--)
R=(10*R+A[i])%X;
return R;
}
void add(Huge C, int unu)
{
//for(int i = )
}
void Add(Huge A, Huge B)
/* A <- A+B */
{ int i,T=0;
if (B[0]>A[0])
{ for (i=A[0]+1;i<=B[0];) A[i++]=0;
A[0]=B[0];
}
else for (i=B[0]+1;i<=A[0];) B[i++]=0;
for (i=1;i<=A[0];i++)
{ A[i]+=B[i]+T;
T=A[i]/10;
A[i]%=10;
}
if (T) A[++A[0]]=T;
}
using namespace std;
int main()
{
freopen("next.in", "r", stdin);
char c = getc(stdin);
UNU[1] = 1;
UNU[0] = 1;
while(isdigit(c))
{
A[ ++A[0] ] = c - '0';
c = getc(stdin);
}
for (int i=1;i<=A[0]/2;i++)
swap(A[i], A[ A[0] - i + 1 ]);
while(!isdigit(c))
{
c = getc(stdin);
}
while(isdigit(c))
{
D[ ++D[0] ] = c - '0';
c = getc(stdin);
}
for (int i=1;i<=D[0]/2;i++)
swap(D[i], D[ D[0] - i + 1 ]);
DivideHuge(A, D, C, R);
if(R[0] == 0)
{
for(int i = A[0]; i >= 1; i --)
{
fout << (int)A[i];
}
return 0;
}
Add(C, UNU);
memset(A, 0, sizeof(A));
MultHuge(D, C, A);
for(int i = A[0]; i >= 1; i --)
{
fout << (int)A[i];
}
return 0;
}