示例#1
0
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;
}
示例#2
0
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]) );
  }