#include <iostream>
#include <cstdlib>
#include <string>
#include "Numero.hpp"

Numero Conv(int k)
{
	std::string u;
	do {
		u = char(k+'0') + u;
		k/= 10;
	} while (k>0);
	return Numero(u.c_str());	
}

Numero Toca(const Numero& q, const Numero& r)
{
	Numero u= "20" * r;
	for (int k=9; k>0; --k) {
		Numero s= Conv(k);
		if ( (u+s)*s <= q )
			return s;
	}
	return Conv(0);
}

void sqroot(const Numero& a, Numero& root, Numero& rem)
{
//	15625
//	43210 nd= 5
	int n= a.ndig()-1;
	if (n%2==0)
		++n;

	root= "0";
	rem = "0";
	Numero t;
	do {
		rem.mul10(2);
		rem[1]= a[n--];
		rem[0]= a[n--];
		t= Toca(rem, root);
		rem= rem - ("20"*root+t)*t;
		root.mul10();
		root[0]= t[0];
	} while (n>0);	
	root.normal();
	rem.normal();
}

int main(int argc, char *argv[])
{
	Numero  a;
	if (argc>1)
		a= Numero(argv[1]);
	else {
		std::cout << "Dar a:\n";
		std::cin >> a;
	}
	std::cout << "a: " << a << std::endl;

	Numero root, rem;
	sqroot( a, root, rem );	
	std::cout << "root: " << root << std::endl;
	std::cout << "rem: " << rem << std::endl;
	std::cout << "a:             " << a << std::endl;
	std::cout << "root*root+rem: " << root*root+rem << std::endl;
	return EXIT_SUCCESS;
}
