算法计算数字是否为3的倍数


13

在进行心理演算时,可以做到:

  • 给定整数k,将所有数字加起来(以10为底),如果结果为3的倍数,则k为3的倍数。

您是否知道有任何算法工作类似,但对二进制数字(位)进行运算?

  • 最初,我正在考虑使用我的语言的现成函数将整数转换为ascii,以执行从2到10的转换,然后应用心理演算技巧。但是当然我也可以自己将基本转换2编码为10。我还没有做,但是我会尝试的。

  • 然后我想到了以2为底的欧几里得分法...

但是我想知道是否还有其他手段,算法。


Answers:


22

考虑以下两个观察结果(留给读者练习):

  1. 2的偶数幂是1模3。
  2. 2的奇数幂是-1模3。

我们得出的结论是,当且仅当偶数位置的位数之和等于模数为3的奇数位置的数之和时,一个数字(二进制​​)才能被3整除。


7
这就像被十进制数11整除的规则。
Yuval Filmus 2013年

1
@YuvalFilmus:准确地说。我本打算为读者添加另一个练习,但还是反对了。
mhum

3
好的,如何确定用十六进制写的数字是否可以被17(十进制)整除?还是15(十进制)呢?;-)
vonbrand

33

有限状态自动机呢?

在此处输入图片说明

axval(x)x2val(x)+axapap { 0 1 2 } 一个{ 0 1 } X { 0 1 } * v 一个X Ñ2p+amod3p{0,1,2}a{0,1}x{0,1}是一个字符串, wheras是二进制字符串的值。val(x)N


1
我喜欢这个主意,让我们尝试9。我以二进制形式输入1001。第一位将我发送到状态1,然后是状态2,然后是状态1,然后又返回状态0。所以state0是3的倍数。算法的复杂性是所使用的位数,仅此而已。这很棒 !
Stephane Rolland 2013年

链接中的这个概念是否相关?我认为这更简单。geomathry.wordpress.com/2017/02/13/0-1-and-a-new-number

1
@WaqarAhmad是的,相关,不简单。就像在您的解释中一样,有限自动机中的过渡也可以用于描述L2R评估。过渡定义,,,,,。这里我们有三个状态,因此状态的三个符号是必需的。您的符号是分别以为模的数字的求值,而L2R求值中的第一个符号是“状态”。如果您想讨论,最好在网站上开始一个新问题!ˉ 0 1= ˉ 1 ˉ 1 0= ˉ 2 ˉ 1 1= ˉ 0 ˉ 2 0= ˉ 1 ˉ 2 1= ˉ 2 Θ101200¯0=0¯0¯1=1¯1¯0=2¯1¯1=0¯2¯0=1¯2¯1=2¯Θ,1,01,2,0
亨德里克·简

不要编程。在三元计算机中,这件事会更有效吗?

4

在二进制数中,数字1、100、10000(= 100×100),1000000(= 100×100×100)等在除以11(三)后都给出相同的余数。因此,如果将二进制数分割为偶数个长度的部分,则这些部分的总和将得到与原始数相同的余数。

(拆分数字时,我们会在开头添加任意多个零。例如,将10111拆分为组01,01,11或0001,0111。)

在数学上,刚刚拆分成数组2位,然后添加组; 并重复此操作,直到结果变为00或11 =原始数字是三的倍数;或01或10 =原始数字不是三的倍数。

对于计算机程序,对于您的CPU ,使用八位,十六位或三十二位的组可能更快。例如,如果八位加法最快,则只需对所有字节求和,然后再次求和,直到结果适合一个字节即可。然后用一条指令除以3后确定余数。

(注意:我们在这里假设无符号整数。带符号的数字需要引起更多注意。例如129是3的倍数,但不是-127,尽管位10000001表示前者是无符号字节,而后者为有符号字节。)


0

尽管不是特定于二进制的,但有疑问时,重复减法始终是使用除法计算除法的可靠方法(因此,如果数字是3的倍数)。


2
反复相减是个坏主意。与余数相除要快得多。
Yuval Filmus 2013年

3
可能在CPU中确实真的非常昂贵,但这是另一种算法:-)不值得-1 :-(
Stephane Rolland 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.