Cod sursa(job #876042)

Utilizator Noradllrares stoica Noradll Data 11 februarie 2013 09:41:11
Problema Next Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<fstream>
#include<iostream>
#include<string>
#include<math.h>
using namespace std;

void afisare(short *v, int nr)
{
	for(int i=0;i<nr;i++) {
		cout << v[i];
	}
	cout << endl;
}

int main()
{
	ifstream f("next.in");
	ofstream g("next.out");
	string n;
	unsigned long long d;
	f>>n;
	f>>d;

	int nrcf=0,cd=d;
	while(cd)
	{
		nrcf++;
		cd/=10;
	}

	int nr = n.length();

	short *v = new short[nr];
	short *w = new short[nr];
	for(int i=0;i<nr;i++)
	{
		v[i] = (short)(n[i]-'0');
		w[i]=v[i];
	}

	unsigned long long num;
	unsigned long long r = 0;

	for(int i=0;i<nr;i++)
	{
		if(v[i] == 0) {
			continue;
		}
		if(nr-i >= nrcf) {
			num=0;
			for(int j=i;j<=nrcf;j++)
			{
				num=num*10+v[j];
			}
			unsigned long long rest=num%d;
			r = rest;
			for(int j=nrcf;j>=i;j--) {
				v[j] = rest%10;
				rest/=10;
			}
		}
	}

	if(r == 0) {
		g << n;
	} else {
		unsigned long long add = d-r;

		bool overflow = false;
		for(int i=nr-1;i>=0;i--) {
			if(add > 0) {
				w[i] = w[i]+add%10;
				if(overflow) {
					w[i]++;
					overflow=false;
				}
				if(w[i] >= 10) {
					overflow = true;
					w[i] -= 10;
				}
				add /= 10;
			} else {
				if(overflow) {
					w[i]++;
					overflow=false;
				}
				if(w[i] >= 10) {
					overflow = true;
					w[i] -= 10;
				} else {
					break;
				}
			}
		}
		if(overflow) {
			g << "1";
		}
		int i=0;
		for(int i=0;i<nr;i++)
			g << w[i];
	}

	/*
	unsigned long long rest = n%d;
	if(rest == 0) {
		g << n;
	} else {
		g<<(n-rest+d);
	}
	*/

	f.close();
	g.close();
	return 0;
}