Cod sursa(job #74683)

Utilizator zobicaMarin Marin zobica Data 27 iulie 2007 02:08:31
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <stdio.h>

int a[1000002], ds[18];
int sr[18];
long long d;
long n;


void citire() {
	freopen("next.in", "r" , stdin);
	int nr = 0;
	char x = getc(stdin);	 
	while (x  != '\n') {
		a[++nr] = x - '0';	
		x = getc(stdin);	 
	}
	a[0] = nr;
	nr = 0;
	x = getc(stdin);	 
	
	d = 0;
	while (x >=  '\n' && !feof(stdin)) {
		ds[++nr] = x - '0';		
		d = d * 10 + ds[nr];
		x = getc(stdin);	 		
	}
	ds[0] = nr;
	fclose(stdin);
}

void invers(int a[]) {
	for (int i = 1; i <= (a[0] >> 1); i ++) {
		int aux = a[i];
		a[i] = a[a[0] - i + 1];
		a[a[0] - i + 1] = aux;
	}
}

void adun(int a[], int b[]) {
	int t =0;
	int n = (a[0] > b[0]) ? a[0] : b[0];
	for (int i = 1; i <= n; i ++) {
		int cif = a[i] + b[i] + t;
		a[i] = cif % 10;
		t  = cif / 10;
	}
	if (t > 0) 
		a[n ++] = t;
	a[0] = n;
}

void scad(int a[], int b[]) {
	int n = (a[0] > b[0]) ? a[0] : b[0];
	for (int i = 1; i <= n; i ++) {
		a[i] -= b[i];
		if (a[i] < 0 ) {
			a[i] += 10;
			a[i + 1] --; 
		}		
	}
	while (n > 2 && a[n] == 0) 
		n --;
	a[0] = n;
}

void afisare(int a[]){
	freopen("next.out", "w", stdout);
	for(int i = a[0] ; i > 0 ; i--)
		printf("%d", a[i]);
	fclose(stdout);
	
}

long long mod(int a[], long long d){  
	long long r = 0;
	for (int i = a[0]; i >=1; i-- )
		r = (r * 10 + a[i]) %d;
	return r;
}

void fac_sir(long long r, int sr[18]){
	sr[0] = 0;
	for(; r; r /= 10 )
		sr[++sr[0]] = r % 10;
} 

int main () {
	citire();
	invers(a);
	invers(ds);
	long long r = mod(a, d);
	fac_sir(r, sr);
	scad(a, sr);
	adun(a, ds);
	afisare(a);
	return 0;	
}