natural DIV_NN_N(const natural& a, const natural& b) { if (NZER_N_B(b)) throw std::invalid_argument("Your divider is equal to zero"); // // natural res = natural(); // // natural divident = a; // // natural divider = b; // // natural fact = natural(); // // while (COM_NN_D(divident, b) == ordinal::GT) { // // divider = b; // // fact = DIV_NN_Dk(divident, divider); // // divider = MUL_NN_N(divider, fact); // // divident = SUB_NN_N(divident, divider); // // res = ADD_NN_N(res, fact); // // } // // return res; natural res; natural _a = a; while (_a >= b) { std::pair<digit, std::int16_t> k = DIV_NN_Dk(_a, b); natural sub = MUL_Nk_N(b, k.second); natural c = SUB_NDN_N(_a, sub, k.first); _a = c; res = res + MUL_Nk_N(natural({ k.first }), k.second); } return res; }
struct NATURAL MUL_NN_N(struct NATURAL E, struct NATURAL B) { // Инициализация числа struct NATURAL result; result.index = ( (E.index * B.index) / 10 > 0) ? (i + j) : (i + j - 1); int i; for (i = 0; i < result.index; ++i) result.number[i] = 0; for (i = 0; i < B.index; ++i) result = ADD_NN_N( result, MUL_ND_N(MUL_Nk_N(E, i), B.number[i]) ); }