示例#1
0
//dodawanie
CNumber CNumber::cAdd(CNumber &cAddend) {
	if (!b_positive && cAddend.b_positive) { // (- this) + addend
		b_positive = true; //na czas operacji zmieniamy znak this

		CNumber c_result (cAddend.cSubtract(*this)); // c_res = addend - this

		b_positive = false;

		return c_result; // addend - this
	}

	if (!cAddend.b_positive && b_positive) { // this + (- addend)
		cAddend.b_positive = true;// na czas operacji zmieniamy znak cAddend

		CNumber c_result (cSubtract(cAddend)); // this - addend

		cAddend.b_positive = false;

		return c_result; // this - addend
	}
	
	if (!b_positive && !cAddend.b_positive) { // (-this) + (-addend)
		cAddend.b_positive = true;
		b_positive = true;

		CNumber c_result (cAdd(cAddend)); // this + addend

		c_result.b_positive = false;
		b_positive = false;
		cAddend.b_positive = false;

		return c_result; // -(this + addend)
	}

	//mamy pewnosc ze obie liczby sa dodatnie
	CNumber c_result (max(i_length, cAddend.i_length) + 1); //dlugosc wyniku jest maksymalnie o 1 wieksza niz dlugosc najwiekszej z liczb

	int j = 0; //zmienna przesuwajaca w lewo odczyt skladnikow sumy
	bool cont = true; //zmienna sterujaca petla
	/* 
	ponizsza petla sumuje cyfry skladnikow sumy i zwieksza odpowiednia pozycje rezultatu o ww. sume poprzez funkcje increment
	funkcja increment odpowiada za zapisanie odpowiedniego wyniku na pozycje cyfry i ewentualne zwiekszenie cyfry wyzszej pozycji
	*/
	for (int i = c_result.i_length - 1; i >= 0 && cont ; i--) {
		if (i_length - 1 - j >= 0 && cAddend.i_length - 1 - j >= 0) //jestesmy w zakresie obu liczb
			c_result.v_increment(i, pi_number[i_length - 1 - j] + cAddend.pi_number[cAddend.i_length - 1 - j]); //zwieksz kazda pozycje rezultatu o sume cyfr na tej pozycji skladnikow sumy
		else if (i_length - 1 - j < 0 && cAddend.i_length - 1 - j < 0)
			cont = false; // wyszlismy z zakresu skladnikow sumy
		else if (i_length - 1 - j < 0)
			c_result.v_increment(i, cAddend.pi_number[cAddend.i_length - 1 - j]); //zwiekszamy tylko o wartosc cAddend na danej pozycji
		else
			c_result.v_increment(i, pi_number[i_length - 1 - j]); //zwiekszamy tylko o wartosc this na danej pozycji
		j++;
	}//for (int i = c_result.i_length - 1; i >= 0 && cont ; i--)

	return c_result;
}//CNumber CNumber::cAdd(CNumber &cAddend)
示例#2
0
//od this odejmij argument funkcji cSubtract
CNumber CNumber::cSubtract(CNumber &cSubtrahend) {
	if (b_positive && !cSubtrahend.b_positive) { // this - (-sub)
		cSubtrahend.b_positive = true;

		CNumber c_result (cAdd(cSubtrahend)); // this + sub

		cSubtrahend.b_positive = false;

		return c_result; // this + sub
	}

	if (!b_positive && !cSubtrahend.b_positive) { //(-this) - (-sub)
		b_positive = true;
		cSubtrahend.b_positive = true;

		CNumber c_result (cSubtrahend.cSubtract(*this)); // sub - this

		b_positive = false;
		cSubtrahend.b_positive = false;

		return c_result;  // sub - this
	}

	if (!b_positive && cSubtrahend.b_positive) { // (-this) - sub
		b_positive = true;

		CNumber c_result(cAdd(cSubtrahend)); // this + sub

		b_positive = false;
		c_result.b_positive = false;
		
		return c_result; // = -(this + sub)
	}

	//mamy pewnosc ze obie liczby sa dodatnie
	if (cSubtrahend.i_length > i_length) {
		CNumber c_result (cSubtrahend.cSubtract(*this));

		c_result.b_positive = false;

		return c_result;
	}

	//odjemnik nie jest wiekszy od odjemnej co pozwala na na:

	CNumber c_result (*this); // na pewno dluzszy nie bedzie wiekszy niz odjemna

	int j = 0;
	bool b_can_sub = true;
	bool b_cont = true;
	for (int i = c_result.i_length - 1; i >= 0 && b_cont && b_can_sub; i--) {
		if (j <= cSubtrahend.i_length - 1) {
			if (c_result.pi_number[i] < cSubtrahend.pi_number[cSubtrahend.i_length - 1 - j])
				if (!c_result.b_borrow(i)) // gdy to wyrazenie zwroci false, wyjdz z petli
					b_can_sub = false;

				// tu na pewno mozna odjac
			if (b_can_sub) //jesli wiemy juz ze nie konczymy petli
				c_result.pi_number[i] -= cSubtrahend.pi_number[cSubtrahend.i_length - 1 - j];
	
			j++;
		}//if (j <= c_result.i_length - 1)

		else
			b_cont = false;
	}//for (int i = c_result.i_length - 1; i >= 0 && cont; i--)

	if (!b_can_sub) { // wyszlismy z petli, wiec c_result < cSubtrahent, this* - sub (nie mozna odjac)
		CNumber c_res(cSubtrahend.cSubtract(c_result));
		c_res.b_positive = false;

		return c_res; // -(sub - this*)
	}//if (!cont)
	
	return c_result;

}//CNumber CNumber::cSubtract(CNumber &cSubtrahend)