def ADD_1N_N(number): """ N-3 Добавление 1 к натуральному числу Степанова Анастасия, 7305 """ # Копируем исходное число result = common.copy_N(number) # Добавляем разряд для предотвращения переполнения result[0] += 1 result[1].append(0) i = 0 # Пока текущий разряд равен 9 - обнуляем его и переходим к следующему while result[1][i] == 9: result[1][i] = 0 i += 1 # Добавляем единицу к первому разряду, не равному 9 result[1][i] += 1 # Если переполнения не произошло - удаляем нулевой старший разряд if result[1][-1] == 0: result[0] -= 1 del result[1][-1] return result
def ADD_NN_N(number1, number2): """ N-4 Сложение натуральных чисел Степанова Анастасия, 7305 """ # Перенос shift = 0 com = COM_NN_D(number1, number2) # Копируем большее число и запоминаем меньшее if com == 2: result = common.copy_N(number1) less = number2 else: result = common.copy_N(number2) less = number1 # Добавляем разряд для переноса result[0] += 1 result[1].append(0) # Складываем цифры i = 0 while i < less[0]: s = result[1][i] + less[1][i] + shift if s > 9: result[1][i] = s - 10 shift = 1 else: result[1][i] = s shift = 0 i += 1 # Если перенос остался if shift == 1: while result[1][i] == 9: result[1][i] = 0 i += 1 result[1][i] += 1 # Если старший разряд остался равным нулю - удаляем его if result[1][-1] == 0: result[0] -= 1 del result[1][-1] return result
def MUL_Nk_N(number, k): """ N-7 Умножение натурального числа на 10^k Томников Роман, 7305 """ # Копируем число result = common.copy_N(number) # Увеличиваем количество разрядов, добавляя нулевые младшие result[0] += k for i in range(k): result[1].insert(0, 0) return result
def SUB_NN_N(number1, number2): """ N-5 Вычитание из первого большего натурального числа второго меньшего или равного Томников Роман, 7305 """ if COM_NN_D(number1, number2) == 1: raise Exception("Первое число должно быть больше второго!") # Копируем первое число result = common.copy_N(number1) # Номер старшего разряда i = number2[0] - 1 while i >= 0: # Если цифра уменьшаемого меньше цифры вычитаемого if result[1][i] < number2[1][i]: result[1][i] += 10 - number2[1][i] # Номер следующего разряда k = i + 1 # Пока следующие разряды равны 0 - ставим их равными 9 while result[1][k] == 0: result[1][k] = 9 k += 1 # От первого ненулевого разряда вычитаем единицу result[1][k] -= 1 else: result[1][i] -= number2[1][i] i -= 1 # Удаляем нулевые старшие разряды while result[1][-1] == 0 and result[0] > 1: result[0] -= 1 del result[1][-1] return result
def MOD_NN_N(number1, number2): """ N-12 Остаток от деления большего натурального числа на меньшее или равное натуральное с остатком (делитель отличен от нуля) Сибиреков Денис, 7305 """ # Вычисляем частное и копируем в результат делимое p = DIV_NN_N(number1, number2) result = common.copy_N(number1) # Вычитаем из результата делитель, умноженный на 10^k и k-ую # цифру частного for i in range(p[0]): result = SUB_NDN_N(result, MUL_Nk_N(number2, i), p[1][i]) # Убираем нули старших разрядов while result[1][-1] == 0 and result[0] > 1: result[0] -= 1 del result[1][-1] return result