Cod sursa(job #44708)

Utilizator alextheroTandrau Alexandru alexthero Data 31 martie 2007 17:22:38
Problema Next Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>

#define cmax 1000005

using namespace std; 

char ch;
int a[cmax],b[cmax],n;
long long d;

int cifra(char x) {
	if(x >= '0' && x <= '9') return 1;
	else return 0;
}

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

void put(int a[],long long v) {
	memset(a,0,sizeof(a));
	do {
		a[++a[0]] = (long long)v % 10;
		v = (long long) v / 10;
	} while(v > 0);
}

void show(int a[]) {
	for(int i = a[0]; i >= 1; i--) printf("%d",a[i]);
	printf("\n");
}

void add(int a[],int b[]) {
	int i,t = 0;
	for(i = 1; i <= a[0] || i <= b[0] || t > 0; i++) {
		t += a[i] + b[i];
		a[i] = t % 10;
		t /= 10;
	    if(i > a[0]) a[0] = i;
	}
}

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

	memset(a,0,sizeof(a));
	while(1) {
		scanf("%c",&ch);
		if(cifra(ch)) a[++a[0]] = int(ch - '0');
		else break;
	}
	reverse(a + 1, a + a[0] + 1);
	scanf("\n");
	scanf("%lld",&d);
	long long r = rest(a,d);
	d = (long long) d - r;
	if(r > 0) {
		put(b,d);
		add(a,b);
	}
	show(a);

	return 0;
}