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; }
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; } }
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"); //ошибочка }
void natural::operator++( int ) { digits = ADD_1N_N(*this).digits; }