Cod sursa(job #2365373)

Utilizator _Victor_Victor Ciobanu _Victor_ Data 4 martie 2019 13:16:20
Problema Next Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

int N[1000010],D[1000010],R[1000010],S[1000010];

ifstream fin("next.in");
ofstream fout("next.out");

void shl(int *A,int c){
	for(int i=A[0]+c;i>=1;i--){
		if(i>c)A[i]=A[i-c];
		else A[i]=0;
	}
	A[0]+=c;
}

int cmp(int *A,int *B){ 
	if(A[0]>B[0])return 1;
	else if(A[0]<B[0])return -1;
	for(int i=A[0];i>=1;i--){
		if(A[i]>B[i])return 1;
		else if(A[i]<B[i])return -1;
	}
	return 0;
}

void dif(int *A,int *B){
	int i,t=0;
	for(i=1;i<=A[0];i++){
		A[i]-=B[i]+t;
		if(A[i]<0){
			A[i]+=10;
			t=1;
		}else t=0;
	}
	while(!A[A[0]])A[0]--;
}

void add(int *A, int *B)
{
      int i,t=0;
	  if(A[0]<B[0]){
	  	i=A[0]+1;
	  	A[i]=0;
		i++;
	  }
      for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
              A[i] = (t += A[i] + B[i]) % 10;
      A[0] = i - 1;
}

void div(int *A,int *B,int *R){
	int i;
	R[0]=0;
	for(i=A[0];i>=1;i--){
		shl(R,1);
		R[1]=A[i];
		while(cmp(B,R)!=1){
			dif(R,B);
		}
	}
}

void write(int *A){
	for(int i=A[0];i>=1;i--)fout<<A[i];
	fout<<'\n';
}
 
void read(int *A){
	string s;
	fin>>s;
	A[0]=s.size();
	for(int i=A[0];i>=1;i--){
		A[i]=s[A[0]-i]-'0';
	}
}

int main(){
	read(N);
	read(D);
	div(N,D,R);
	dif(D,R);
	if(D[0]){
		add(N,D);	
	}
	write(N);
	return 0;
}