Cod sursa(job #37433)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 25 martie 2007 09:31:51
Problema Next Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 4, Clasa a 9-a si gimnaziu Marime 1.06 kb
#include <stdio.h>

const int N_MAX = 1048576;

int N[N_MAX], pl[N_MAX];
long long D, rest;

long long mod(int A[], int B)
{
	int i;
    long long t = 0;
	for (i = A[0]; i > 0; i --) {
		t = (t * 10 + A[i]) % B;
	}

	return t;
}

void rev(int A[])
{
	int i, aux;
	
	for (i = 1; i <= A[0] / 2; i ++) {
		aux = A[i];
		A[i] = A[A[0] - i + 1];
		A[A[0] - i + 1] = aux;
	}	
}

void add(int A[], int B[])
{
	int i, t = 0;
	
	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;
}	

int main()
{
	freopen("next.in", "r", stdin);
#ifndef _KKT_
	freopen("next.out", "w", stdout);
#endif

	char c;
	scanf("%c", &c);
	while (c != '\n') {
		N[++ N[0]] = c - '0';
		scanf("%c", &c);
	}

	rev(N);

	scanf("%lld\n", &D);
	rest = mod(N, D);
		
	int i;
	
	if (rest == 0) {
		for (i = N[0]; i >= 1; i --) {
			printf("%d", N[i]);
		}
		printf("\n");
	} else {
		D -= rest;

		while (D > 0) {
			pl[++ pl[0]] = D % 10;
			D /= 10;
		}
		
		add(N, pl);
		for (i = N[0]; i >= 1; i --) {
			printf("%d", N[i]);
		}
		printf("\n");
	}
	
	return 0;
}