Pagini recente » Rating Debora Deleanu (deboradeleanu) | Cod sursa (job #686232) | Cod sursa (job #1694744) | Cod sursa (job #2364076) | Cod sursa (job #44614)
Cod sursa(job #44614)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define fin "next.in"
#define fout "next.out"
#define NMAX 1000002
#define DMAX 18
int N[NMAX],D[DMAX];
FILE *f,*g;
void read(int A[])
{
char * s = (char*) malloc(NMAX);
fgets(s,NMAX+1,f);
if(s[strlen(s)-1] == '\n') s[strlen(s)-1] = '\0';
A[0] = strlen(s);
for(int i = A[0] ; i ; --i)
A[i] = s[A[0]-i] - '0';
}
void write(int A[])
{
g = fopen(fout,"w");
for ( int i = A[0] ; i ; --i)
fprintf(g,"%d",A[i]);
fclose(g);
}
void readData()
{
f = fopen(fin,"r");
read(N);
read(D);
fclose(f);
}
void lshift(int A[],int x)
{
memmove(&A[1+x],&A[1],sizeof (int) * A[0]);
memset(&A[1],0,sizeof(int) * x);
A[0] += x;
}
int sgn(int A[], int B[])
{
int i;
if(A[0]>B[0]) return 1;
if(A[0]<B[0]) return -1;
for (i = A[0] ; i>1 && A[i]==B[i]; --i);
return A[i] < B[i] ? -1:A[i] == B[i] ? 0 : 1;
}
void sub(int A[],int B[],int C[])
{
C[0] = A[0];
for ( int i = 1 , t = 0 ; i<= A[0] ; ++i)
C[i] += ( t = (C[i] = A[i] - B[i] - t) < 0 ) * 10;
while(!C[C[0]] & C[0]>1) --C[0];
}
void add(int A[] , int B[] ,int C[])
{
int i,t;
for ( i = 1 , t = 0 ;i<=A[0] | i<=B[0] | t ; ++i,t/=10)
C[i] = (t += A[i] + B[i]) % 10;
C[0] = i-1;
}
void mod(int X[], int Y[], int R[]) // R = X % Y
{
int tmp[DMAX];
for ( int i = X[0] ; i ; --i )
{
if(R[1] | R[0]>1) lshift(R,1);
R[1] = X[i];
while(sgn(R,Y) != -1)
{
memset(tmp,0,sizeof tmp);
sub(R,Y,tmp);
memmove(R,tmp,sizeof tmp);
}
}
}
int C1[DMAX],C2[NMAX];
void solve()
{
C1[0] = 1;
C2[0] = 1;
mod(N,D,C1);
if(C1[1])
{
sub(D,C1,C2);
//add(N,C2,N);
}
write(N);
}
int main()
{
readData();
solve();
return 0;
}