//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)
//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)