Esempio n. 1
0
DM_Z DIV_ZZ_Z (DM_Z X1, DM_Z X2)
{
    DM_N t;  //Объявляем переменную счётчик
    DM_N natX1 = TRANS_Z_N (X1); //Объявляем натуральные аналоги целым числам
    DM_N natX2 = TRANS_Z_N (X2);
    if (!NZER_N_B(natX2))    //Если делитель равен нулю. выдаем ошибку
        printf("Делитель равен нулю.");
    else if (COM_NN_D(natX1, natX2)==2)  //Если Первое число больше второго:
    {
        do
        {
            natX1=SUB_NN_N(natX1, natX2); //Вычитаем из большего числа меньшее
            t=ADD_1N_N(t);      //Наращиваем t
        }
        while (COM_NN_D(natX1, natX2)==2); //Цикл пока делимое больше делителя
        t = TRANS_N_Z(t);  //Переводим результат в целое
        if (POZ_Z_D(X1)==1 && POZ_Z_D(X2)==2 || POZ_Z_D(X1)==2 && POZ_Z_D(X2)==1)
           t= MUL_Z-_Z(t); //Если исходные числа имеют разные знаки,
                           //Поменять знак у результата
        return t;
    }

    else if (COM_NN_D(natX1, natX2)==1) //Если второе число больше первого:
    {                                   //Выполняем аналогичные действия.
        do
        {
            natX1=SUB_NN_N(natX1,natX1);
            t=ADD_1N_N(t);
        }
        while (COM_NN_D(natX1, natX1)==2);
        t = TRANS_N_Z(t);
        if (POZ_Z_D(X1)==1 && POZ_Z_D(X2)==2 || POZ_Z_D(X1)==2 && POZ_Z_D(X2)==1)
           t= MUL_Z-_Z(t);
        return t;
    }
    else if (COM_N_D(natX1, natX2)==0)  // Если числа равны:
    {
        t = TRANS_N_Z(t);  // Переводим t в целое
        t.a[0]=1;  //Присваиваем результату значение 1
        t.n=1;
        if ((POZ_Z_D(X2)==2 && POZ_Z_D(X1)==1) || (POZ_Z_D(X2)==1 && POZ_Z_D(X1)==2))
        t.b=!t.b; //Если исходные числа имели разные знаки, меняем знак результата.
    }
    return t;
}
Esempio n. 2
0
DM_N DIV_NN_N (DM_N X1, DM_N X2)
{
   DM_N xCopy;         //Объявляем временную переменную, которая будет
                       //хранить копию делимого
   DM_N t=DM_N();    //Объявляем переменную счётчик, обнуляем.
   if (!NZER_N_B(X2))    //Если делитель равен нулю, выдает ошибку
      printf("Делитель равен нулю.");
   else
      if (COM_NN_D(X1, X2)==2) //Если Первое число больше второго:
      {
        xCopy=X1; //Во временную переменную записываем значение большего числа
        do
         {
            xCopy=SUB_NN_N(xCopy, X2);  //Вычитаем из большего числа меньшее
            t=ADD_1N_N(t);  //Наращиваем t
         }
         while (COM_NN_D(xCopy, X2)==2 || COM_NN_D(xCopy, X2)==0);  //Цикл пока делимое больше или равно делителя
         return t;  //Возвращаем t
      }

      else
        if (COM_NN_D(X1, X2)==1)  //Если второе число больше первого: (Делаем те же операции)
           {
                xCopy = X2;
                do
                  {
                    xCopy=SUB_NN_N(xCopy,X1);
                    t=ADD_1N_N(t);
                  }
                while (COM_NN_D(xCopy, X1)==2);
                return t;
           }
        else
          if (COM_N_D(X1, X2)==0)  //Если числа равны
          {
              t=ADD_1N_N(t);   //Наращиваем один раз t, чтобы t равнялось 1
              return t;        //Возвращаем t;
          }
}
Esempio n. 3
0
integer DIV_ZZ_Z(const integer& a, const integer& b)
{
    integer A = a;
    integer B = b;
    integer result;
    if (B.module.order() != 0)  //если делитель НЕ равен нулю
    {
    if (A.isPositive == B.isPositive)  //если знаки равны
        result.isPositive = true;  //частное положительное
    else
        result.isPositive = false;  //частное отрицательное
    result = DIV_NN_N(A.module, B.module);  //обычный остаток, пример: (−17):(−5) = 4 (ост. 3) или 17:5 = 4 (ост. 3)
    if ((((!A.isPositive) && (B.isPositive)) || ((!A.isPositive) && (!B.isPositive))) && (MOD_NN_N(A.module, B.module).order() != 0)) //если первый отрицательный, а второй положительный и не делятся нацело
            result = ADD_1N_N(result.module); //прибавляем единицу      
    return result; //возвращаем ответ
    }
    else //если делитель равен нулю
        throw std::invalid_argument("Da nuuu ti chyo...Na ziro delish"); //ошибочка
}
Esempio n. 4
0
void natural::operator++( int ) {
    digits = ADD_1N_N(*this).digits;
}