Algorithm 如何有效地确定数字是否是7的倍数?
有多种方法可以找到相同的结果,我试着使用按位运算-Algorithm 如何有效地确定数字是否是7的倍数?,algorithm,numbers,Algorithm,Numbers,有多种方法可以找到相同的结果,我试着使用按位运算- if(((n<<3) - n)%7 == 0 ) { print "divide by 7"; } if((n我认为if(n%7==0)是检查7整除性更有效的方法。 但是,如果您处理的是大量数据,并且无法直接执行模数操作,那么这可能会有所帮助: 当且仅当x时,10x+y形式的数字可被7整除− 2y可被7整除。换句话说,从剩余数字形成的数字中减去最后一个数字的两倍。继续执行此操作,直到获得已知可被7整除的数字。原始数字可被7
if(((n<<3) - n)%7 == 0 ) {
print "divide by 7";
}
if((n我认为if(n%7==0)
是检查7整除性更有效的方法。
但是,如果您处理的是大量数据,并且无法直接执行模数
操作,那么这可能会有所帮助:
当且仅当x时,10x+y
形式的数字可被7
整除− 2y
可被7
整除。换句话说,从剩余数字形成的数字中减去最后一个数字的两倍。继续执行此操作,直到获得已知可被7
整除的数字。原始数字可被7
整除,当且仅当使用此过程获得的数字可被7
例如,数字
371:37− (2×1) = 37 − 2 = 35; 3 − (2 × 5) = 3 − 10 = −7、
因此,由于−7
可被7
整除,371
可被7
整除
3
。形式为10x+y
的数字被7
除时具有与3x+y
相同的余数。必须将原始数字的最左边的数字乘3
,再加上下一个数字,在被7
除时取余数,然后从b开始继续开始:乘以3
,添加下一个数字,等等。例如,数字
371:3×3+7=16
余数2
,和2×3+1=7
此方法可用于求除7的余数。
附言:
因此,如果您的数字可以用硬件支持的整数表示,并且硬件具有除法或模运算,那么您应该只使用这些运算。它比您将要编写的任何运算都简单,而且可能更快。要与硬件竞争,您必须使用汇编程序,并使用比硬件制造商更好的其他更快的指令rs做到了,如果没有未记录的技巧,他们可以使用,但你不能 这个问题变得有趣的地方是涉及任意大的整数。模运算有一些技巧。例如,我可以告诉你10000000001000010000可以被3整除,尽管我的大脑与计算机相比是一个非常慢的数学处理器,因为模运算符的这些特性:
(a+b+c)%d=((a%d)+(b%d)+(c%d))%d
(n*a)%d=((a%d)+(a%d)+(a%d)+……(n次))%d=(n*(a%d))%d
- 10%3=1
- 100%3=(10*(10%3))%3=10%3=1
- 1000%3=(10*(100%3))%3=1 等等
8%7=1
由此我们可以推断:
(8**N)%7=(8*(8*(…*(8*(8%7)%7)%7).%7=1
所以,为了“快速”测试任意大的八进制数的7的可除性,我们所需要做的就是把它的八进制基数8位相加,然后尝试将其除以7
最后是坏消息
张贴的代码:
if((n.Division在现代处理器上速度很快。我怀疑你能打败硬件Division,除非你是为GBA或其他什么东西编程的。if(X%7)有什么问题==0
?一般来说,如果一个数字的基数n+1
中的数字之和可以被n
整除,那么这个数字就可以被n
整除。所以你可以在你的情况下使用八进制(3位组)这就是它工作的原因。我很困惑。你的代码如果((n)谢谢你这么详细的解释,保罗。谢谢米兰讨论这个问题。