Алгоритм добавления двух цифр в конец числа для расчета определенного модуля? - PullRequest
2 голосов
/ 10 ноября 2008

Итак, допустим, у меня есть номер 123456. 123456% 97 = 72. Как определить, какие две цифры необходимо добавить в конец 123456, чтобы новое число% 97 = 1? Примечание - это всегда должно быть две цифры.

Например, 123456 76 % 97 = 1. В этом случае мне нужно добавить цифры "76" в конце числа.

(Это для расчета номера IBAN.)

Ответы [ 5 ]

9 голосов
/ 10 ноября 2008
x = 123456

x = x * 100
newX = x + 1 + 97 - (x % 97)

Изменить: поставить 100 в неправильном месте

7 голосов
/ 10 ноября 2008

Вы вычисляете модуль 123456 00 до 97 и добавляете (97 - это + 1) к этому числу. Таким образом, вы получите то, что Роборг объяснил, что чище выше:)

2 голосов
/ 07 июля 2016

Допустим, мы должны получить номер, содержащий 12 цифр.

Шаг 1: Запишите любое случайное число из 10 цифр, то есть на 2 цифры меньше необходимого, например 1234567890 - это X

Шаг 2: Х * 100 = 123456789000. 45 123456789000 ’- это Y

Шаг 3: Y / 97 = 1272750402.061856. «06» - это Z

Шаг 4: 97 - Z + 1 = 92. «92» - это W

Шаг 5: Конечный номер сделки - X, за которым следует W, то есть «123456789092»

Примеры принятых номеров: 100000000093 100000000190 100000000287 Etc.

2 голосов
/ 10 ноября 2008

Это уравнение, которое вам нужно

 X = Y -(Number*100 mod y) - 1

где:

   Number = 123456
    Y = 97
    X the number you need
1 голос
/ 10 ноября 2008

Арифметика по модулю действительно ничем не отличается от обычной арифметики. Ключом к решению проблемы, с которой вы столкнулись, является осознание того, что то, что вы обычно делаете для решения этой проблемы, все еще действует (в дальнейшем любое упоминание числа означает целое число):

Скажем, у вас есть

15 + х = 20

Способ решения этой проблемы заключается в понимании того, что обратное значение 15 при регулярном сложении равно -15, после чего вы можете написать (используя коммутативность и ассоциативность, как мы это обычно делаем)

15 + х + (-15) = (15 + (-15)) + х = 0 + х = х = 20 + (-15) = 5

так что ваш ответ х = 5

Теперь к вашей проблеме.

Скажите, что N и M известны, и вы ищете x при сложении по модулю k:

(N + x) mod k = M

Сначала поймите, что

(N + x) mod k = ((N mod k) + (x mod k)) mod k

и чтобы проблема имела смысл

М мод к = М

и

х мод к = х

так, чтобы

N mod k = N_k

и

(a + b) mod k = a + _k b

у вас есть

N_k + _k x = M

, что означает, что вам нужно инвертировать N_k под + _k. Это на самом деле довольно просто, потому что обратное значение + _k соответствует тому, что удовлетворяет этому уравнению:

N_k + _k ("-N_k") = 0

что на самом деле довольно просто, потому что для числа y такое, что 0 <= y <k </p>

(y + (k - y)) mod k = k mod k = 0

так что

"- N_k" = (k-N_k)

, а затем

N_k + _k x + _k "-N_k" = N_k + _k "-N_k" + _k x = 0 + _k x = x = M + _k "-N_k" = M + _k (k - N_k)

так что решение до

(N + x) mod k = M

есть

x = (M + (k - (N mod k))) mod k

и, в частности, для вашей проблемы

(12345600 + x)% 97 = 1

решается

x = (1 + (97 - (12345600 мод 97))) мод 97 = 76

Обратите внимание, что требование, согласно которому в вашем решении всегда должны быть две цифры, заложено, если k <100 </p>

...