在数字末尾添加两位数以计算特定模数的算法?

Posted

技术标签:

【中文标题】在数字末尾添加两位数以计算特定模数的算法?【英文标题】:Algorithm to add two digits to the end of a number to calculate a specific modulus? 【发布时间】:2010-09-21 15:10:56 【问题描述】:

所以,假设我有一个数字 123456。123456 % 97 = 72。我如何确定需要在 123456 的末尾添加哪些两位数字,以便新数字 % 97 = 1?注意——必须是两位数。

例如,12345676 % 97 = 1。在这种情况下,我需要在数字末尾添加数字“76”。

(这是用于计算 IBAN 号码。)

【问题讨论】:

【参考方案1】:

假设我们必须接收包含 12 位数字的号码。

第 1 步: 写出任意 10 位的随机数,即比需要的少 2 位,例如1234567890 - 这是X

第 2 步: X * 100 = 123456789000。 ‘123456789000’ - 这是Y

第 3 步: Y / 97 = '1272750402.061856'。 '06' - 这是 Z

第 4 步: 97 – Z + 1 = 92。 '92' - 这是W

第 5 步: 最终交易编号为 X 后跟 W,即 '123456789092'

接受号码的示例: 100000000093 100000000190 100000000287 等等。

【讨论】:

【参考方案2】:

模算术与常规算术实际上并没有什么不同。解决您遇到的此类问题的关键是要意识到您通常会做的解决该问题的方法仍然有效(在下文中,任何提及数字都意味着整数):

说你有

15 + x = 20

你解决这个问题的方法是通过意识到在正则加法下 15 的倒数是 -15 然后你可以写(利用交换性和结合性,就像我们自然做的那样)

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

所以你的答案是 x = 5

现在谈谈你的问题。

假设 N 和 M 已知,并且您正在寻找模 k 加法下的 x:

( N + x ) 模 k = M

首先意识到这一点

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

让问题变得有意义

M mod k = M

x mod k = x

N mod k = N_k

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

你有

N_k +_k x = M

这意味着你需要的是+_k下的N_k的倒数。这实际上非常简单,因为 +_k 下的倒数就是满足这个等式的任何东西:

N_k +_k ("​​-N_k") = 0

这实际上非常简单,因为对于一个数字 y 使得 0

(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 ) 模 k = M

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

特别是针对您的问题

(12345600 + x) % 97 = 1

解决了

x = ( 1 + ( 97 - ( 12345600 mod 97 ) ) ) mod 97 = 76

请注意,只要 k ,您的解决方案始终包含两位数的要求是内置的

【讨论】:

【参考方案3】:

您将 12345600 的模数计算为 97,然后将 (97 - that + 1) 添加到该数字。 所以你得到了 RoBorg 上面解释的清洁剂:)

【讨论】:

【参考方案4】:

这是你需要的方程式

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

地点:

   Number = 123456
    Y = 97
    X the number you need

【讨论】:

你怎么会说- 1 而所有其他答案都是+ 1?是不是少了一些括号?【参考方案5】:
x = 123456

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

编辑:将 100 放在错误的位置

【讨论】:

123456 + 1 + 97 - ((123 456 * 100) % 97) = 123532 答案应该是12345676吧? 我得到 newX = 123532。如果你的解决方案是正确的,我不确定我是否理解它。 并且括号')'是不平衡的——三个关闭,两个打开。燕鸥不见了吗? 我想我明白了——两位数 = newX - x。我认为您需要将其添加到您的答案中。

以上是关于在数字末尾添加两位数以计算特定模数的算法?的主要内容,如果未能解决你的问题,请参考以下文章

[计算机组成原理] Booth算法 —— 补码一位乘法

需要一个有效的减法算法模数

MATLAB如何使计算结果保留4位有效数字

powerbuilder编写的计算器中怎么让得出的结果保留两位有效数字

计算第一个三角形数以在 python 中有超过 500 个除数

计算钱时一定要保留两位小数吗