在进行心理演算时,可以做到:
- 给定整数k,将所有数字加起来(以10为底),如果结果为3的倍数,则k为3的倍数。
您是否知道有任何算法工作类似,但对二进制数字(位)进行运算?
最初,我正在考虑使用我的语言的现成函数将整数转换为ascii,以执行从2到10的转换,然后应用心理演算技巧。但是当然我也可以自己将基本转换2编码为10。我还没有做,但是我会尝试的。
然后我想到了以2为底的欧几里得分法...
但是我想知道是否还有其他手段,算法。
在进行心理演算时,可以做到:
您是否知道有任何算法工作类似,但对二进制数字(位)进行运算?
最初,我正在考虑使用我的语言的现成函数将整数转换为ascii,以执行从2到10的转换,然后应用心理演算技巧。但是当然我也可以自己将基本转换2编码为10。我还没有做,但是我会尝试的。
然后我想到了以2为底的欧几里得分法...
但是我想知道是否还有其他手段,算法。
Answers:
考虑以下两个观察结果(留给读者练习):
我们得出的结论是,当且仅当偶数位置的位数之和等于模数为3的奇数位置的数之和时,一个数字(二进制)才能被3整除。
有限状态自动机呢?
p ∈ { 0 ,1 ,2 } 一个∈ { 0 ,1 } X ∈ { 0 ,1 } * v 一个升(X )∈ Ñ是一个字符串, wheras是二进制字符串的值。
在二进制数中,数字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表示前者是无符号字节,而后者为有符号字节。)
尽管不是特定于二进制的,但有疑问时,重复减法始终是使用除法计算除法的可靠方法(因此,如果数字是3的倍数)。