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 等等
    因此,为了判断一个以10为基数的数字是否可以被3整除,我们只需对这些数字求和,然后看看这个和是否可以被3整除

    现在使用相同的技巧,用八进制或基数-8表示大二进制数(上面@hropyatr在评论中也指出了这一点),并使用7的整除性,我们得到了特例:

    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)谢谢你这么详细的解释,保罗。谢谢米兰讨论这个问题。