小赖子的英国生活和资讯

如何快速的判断整数能否被11整除?

阅读 桌面完整版

1位数除0之外不能被11整除, 2位数的话 除了 11, 22, 33 .. 99 之外不能被11整除. 3位数的话 121, 132 .. 可以把个位数和百位数相加 然后减去十位数 如果为0就能被整除, 比如 176 能被11整除因为 1+6-7=0. 4位数以上就比较麻烦了, 不过有更为简便的方法.

假设 整数为 那么只要 那么这个整数就能被11整除.

比如 3619 这个整数 我们可以拆成 +3 -6 +1 -9 这4个数字, 相邻的符号取反并求和, 为 -11 能被11整除 所以 3619 也能被11整数 商为329. 最左边数字的符号可取正也可取负, 如果取负的话, -3+6-1+9=11 判断也是成立的. 这个简单的数学小技巧是怎么来的呢?

因为: 1, 100, 10000, 100000, .. 除于11的余数为1 而 10, 1000, 100000… 除于11余数为 -1 所以任何整数都可以写成:

假设 n 是奇数 那么 除11取余数为:
若是 偶数 那么 除11取余数为:

两种情况都是把 每位数字符号取反相加求和, 然后再判断这个值是否能被 11整除就可以了.

这个算法在判断高精度整数就能用上了, 所谓的高精度整数就是很大很大的整数(位数远超过了计算机4个字节或者8个字节所能表示的值)

献上 VBScript 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
Function DivBy11(num)
    s = 0
    sign = 1
    For i = 1 To Len(num)
        s = s + (Asc(Mid(num, i, 1)) - 48) * sign
        sign = -sign
    Next
    DivBy11 = (s Mod 11) = 0
End Function
 
If DivBy11("3619") Then
    Msgbox "可以被整除" 
End If
Function DivBy11(num)
	s = 0
	sign = 1
	For i = 1 To Len(num)
		s = s + (Asc(Mid(num, i, 1)) - 48) * sign
		sign = -sign
	Next
	DivBy11 = (s Mod 11) = 0
End Function

If DivBy11("3619") Then
	Msgbox "可以被整除" 
End If

参考英文: C++ Coding Exercise: How to Check if a Large Integer is divisible by 11?

强烈推荐

微信公众号: 小赖子的英国生活和资讯 JustYYUK

阅读 桌面完整版
Exit mobile version