Cod sursa(job #74693)

Utilizator zobicaMarin Marin zobica Data 27 iulie 2007 12:13:13
Problema Next Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>

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


void citire() {
	freopen("next.in", "r" , stdin);
	long nr = 0;
	char x = getc(stdin);	 
	while (x >= '0' && x <='9') {
		a[++nr] = x - '0';	
		x = getc(stdin);	 
	}
	while (x < '0' || x > '9')
		x = getc(stdin);
	a[0] = nr;
	nr = 0;
	d = 0;
	while (x >= '0' && x <='9') {
		ds[++nr] = x - '0';		
		d = d * 10 + ds[nr];
		x = getc(stdin);	 		
	}
	ds[0] = nr;
	fclose(stdin);
}

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

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

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

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

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

void fac_sir(long long r, long 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(d);
	if (r) {
		fac_sir(r, sr);
		scad(sr);
		adun(ds);
	}
	afisare();
	return 0;	
}