Cod sursa(job #123346)

Utilizator silviugSilviu-Ionut Ganceanu silviug Data 15 ianuarie 2008 17:29:06
Problema Next Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
#include <math.h>
#include <string.h>

#define MAX_LEN 1000010
long long dv, rest, len, i, sum;
long v_sum[MAX_LEN], a[64];
char n[MAX_LEN];

long rest_fun() {
	long ipr = 0;
	for (ipr = v_sum[0]; ipr >= 1; --ipr) {
		rest = rest * 10 + v_sum[ipr];
		if (rest > dv) {
			rest = rest % dv;
		}
	}
	return 0;
}

long afis_sum() {
	long ipr = 0, t = 0, aux = 0;
	for (ipr = 1; ipr <= v_sum[0] || ipr <= a[0] || t; ++ipr) {
		aux = v_sum[ipr] + a[ipr] + t;
		v_sum[ipr] = aux % 10;
		t = aux / 10;
	}
	v_sum[0] = ipr - 1;
	
	for (ipr = v_sum[0]; ipr >= 1; --ipr) {
		printf("%d", v_sum[ipr]);
	}
	return 0;
}

void show() {
	long ipr = 0;
	for (ipr = v_sum[0]; ipr >= 1; --ipr) {
		printf("%ld", v_sum[ipr]);
	}
}

int main() {
	freopen("next.in", "r", stdin);
	freopen("next.out", "w", stdout);
	fgets(n, MAX_LEN, stdin);
	len = strlen(n) - 1;
	for (i = len - 1; i >= 0; --i) {
		v_sum[++v_sum[0]] = (long)(n[i] - '0');
	}
	scanf("%lld", &dv);
	
	rest_fun();
	if (rest == 0) {
		show();
		printf("\n");
		return 0;
	}
	sum = dv - rest;
	while (sum != 0) {
		a[++a[0]] = sum % 10;
		sum /= 10;
	}
	afis_sum();
	printf("\n");
	return 0;
}