标题：除法之对位互换倒算法
对位互换倍乘倒算法
前言对位互换倍乘倒算法[1]是：循环小数倒算法之——《化偶、消5、归1、对位互换、倍乘、逐步退位相加、回调、9入》法的简称！这个算法优点是经过很少几次的试乘就可以不用除法中的试除！算法全析如果要进行除法运算的这个算式里的除数的个位数为0、2、4、5、6、8，那么先进行第一步分解运算！否则就请直接进行第二步！ 
第一步：化偶消5： 
化偶即化偶为奇，就是把除数是偶数的先化为奇数！ 
（1）：以0为尾数的偶数，直接去0，可以多次去0，直到最后不是0，如果这个数还是偶数，那么再进行（2）。（这里要记住去0去了几次，以备下面运算时可以回调退位用）！ 
（2）：把个位数是2.4.6.8的数以除以2的方式化成奇数！可以多次化偶，直到这个数为奇数为止。（这里要记住化偶化了几次，以备下面运算时可以回调用）！ 
（3）： 消5：即把个位数是5的数以除以5的方式消5为1、3、7、9，可以多次消5，直到这个数的个位数为1、3、7、9为止！（这里要记住消5消了几次，以备下面运算时可以回调用）1 
如果要进行除法运算的这个算式的被除数大于1的，那么请先进行第二步归1分解运算！否则请直接进行第三步！ 
第二步： 归1： 
就是把被除数先看成1！ 
第三步：对位互换（这是这个算法的核心）： 
对位数，就是用1作为被除数除以某一个数，得出的循环节的尾数（对位数的位数与除数的位数相同） 
（1）： 先算出对位数，对位数算如下（对位数由除数求出，从除数的个位数开始逐步求出）： 
例1： 比如求123的对位数； 
（1）：先取出除数的个位数，3，然后再与0到9这十个数进行试乘运算，如果算出正好是尾9（尾9的位数起码要与对位数的位数相同），那么这个数就是3的对位数，经试乘得：3*3= 9；由此得出3是3的对位数，（其实大家都知道，从0到9这10个数里面只有3*3才能得一个9）！ 
（2）：再取出除数的十位数2并与个位数的3组成23，然后再与0到9这十个数跟刚才算出的对位数3（这个3不是除数里的3）进行组合（从03到93）进行试乘，如果算到某个试乘出来的 积正好有与对位数的位数相同的个数的尾9（尾9的位数起码要与对位数的位数相同），那么这个数就是23的对位数，经试乘得：23*13=299；由些得出13是23的对位数，（其 实从03到93这个10个数只有13与23相乘才能得不少与2个的尾9）！ 
（3）：接着再取出除数的百位数1并与23组合出123，然后再与0到9这十个数跟刚才算出的对位数13进行组合（013到913）进行试乘；如果算到某个试乘出来的积正好有与对位数的位 数相同的个数的尾9（尾9的位数起码要与对位数的位数相同），那么这个数就是123的对位数，经试乘得：813*123=99999（尾9的个数不少与3位，因为对位数的位数就是3位） ，由些得出813是123的对位数！（其实从013到913这个10个数只有813与123相乘才能得不少与3个的尾9）！ 
同理，大家可以对用813求对位数，经上面的几步也可以得出813的对位数是123！ 
例2：求987654321的对位数； 
（1）：先取出除数的个位数，3，然后再与0到9这十个数进行试乘运算，如果算出正好是尾9（尾9的位数起码要与对位数的位数相同），那么这个数就是1的对位数，经试乘得：9*1=9 ；由些得出9是1的对位数，（其实大家都知道，从0到9这10个数里面只有9*1才能得一个9）！ 
（2）：再取出这个数的2并个位数的1组成21，然后再与0到9这十个数跟刚才算出的对位数9进行组合（从09到99）进行试乘，如果算到某个试乘出来的积正好有与对位数的位数相同的 个数的尾9（尾9的位数起码要与对位数的位数相同），那么这个数就是21的对位数，经试乘得：21*19=399；由些得出19是21的对位数，（其实从09到99这个10个数只有19与21相 乘才能得不少与2个的尾9）！ 
（3）：接着再取出除数的百位数3并与21组合出321，然后再与0到9这十个数跟刚才算出的对位数19进行组合（019到919）进行试乘；如果算到某个试乘出来的积正好有与对位数的位 数相同的个数的尾9（尾9的位数起码要与对位数的位数相同），那么这个数就是321的对位数，经试乘得：321*919=294999（尾9的个数不少与3位，因为对位数的位数就是3位） ，由些得出919是321的对位数！（其实从019到919这个10个数只有919与321相乘才能得不少与3个的尾9）！ 
（4）：再取出除数的千位数4，并用以上的方式再进行试乘得：4321*9919=42859999（4个尾9），由此确定4321的对位数是9919！ 
（5）：再取出除数的万位数5，并用以上的方式再进行试乘得：54321*99919=5427699999（5个尾9），由此确定54321的对位数是99919！ 
（6）：再取出除数的十万位数6，并用以上的方式再进行试乘得：654321*999919=654267999999（6个尾9），由此确定654321的对位数是999919！ 
（7）：再取出除数的百万位数7，并用以上的方式再进行试乘得：7654321*9999919=76542599999999（8个尾9但不少与7个尾9，所以有效），由此确定7654321的对位数是9999919！ 
（8）：再取出除数的千万位数8，并用以上的方式再进行试乘得：87654321*99999919=8765424999999999（9个尾9但不少与8个尾9，所以有效），由此确定87654321的对位数是 99999919！ 
（9）：再取出除数的亿位数8，并用以上的方式再进行试乘得：987654321*999999919=987654240999999999（9个尾9），由此确定987654321的对位数是999999919！ 
同理，大家可以对用999999919求对位数，经上面的几步也可以得出999999919的对位数是987654321！ 
例3：求142857的对位数： 
（1）：取出7，经试乘得7的对位数是77*7=49（一个尾9！ 
（2）：再取出5组成57，经试乘得57的对位数是07（注意，这里是07而不是7，虽然其值都是7，但因为对于小数循环的意思就不一样了）57*07=399（2个尾9）！ 
（3）：再取出8组成857，经试乘得857的对位数是007（注意，这里是007而不是7，虽然其值都是7，但因为对于小数循环的意思就不一样了）857*007=5999（3个尾9）！ 
（4）：再取出2组成2857，经试乘得2857的对位数是0007（注意，同上）2857*0007=19999（4个尾9）！ 
（5）：再取出2组成42857，经试乘得42857的对位数是00007（注意，同上）12857*00007=299999（5个尾9）！ 
（6）：再取出1组成142857，经试乘得142857的对位数是000007（注意，同上）142857*000007=999999（6个尾9）！ 
由此得142857的对位数是7！ 
第四步（其实是同第三步同时求出）：求倍乘数： 
倍乘数，就是用倍乘数去乘对位数，倍乘数就是用除数与对位数的积加1再除以（10的对位数的位数次方）然后再逐步退位相加得循环小数的循环节： 
第五步，逐步退位相加： 
上面例1的求3的对位数是3的过程当中，得积是9，倍乘数就是用这个积加1再除以（10的对位数的位数次方）10的一次方等于10，再9+1/10得1这就是对位数为3的倍乘数逐步退位相加处循环小数如下表： 
3
3*1=3
逐位相加
前一步出现3，与对位数的值相同，说明已经是一个循环节了！所以在这里加小数点！
3
3
循环节为33，即得1/3=0.3…………3 
判断是否已经一个循环节用对位数来判断，如果第二次出现对位数，那么说明已经是一个循环节了！） 
再看1求23的对位数的过程当中得积299，这里把299加1得300再除以（10的对位数的位数次方），10的两次方得100，300/100=3，这就求出了13与23的倍乘数是3逐步退位相加得循环小数如下表： 
13
13*3=39
39*3=117
17*3+1= 52
52*3= 156
56*3+1= 169
69*3+1= 208
08*3+2= 26
26*3= 78
78*3=234
34*3+2=104
04*3+1= 13
前一步出现了13，与对位数相同，说明已经循环了一个循环节！所以在这里前面加小数点！
取104后两位，把1进到下步
取234后两位，把2进到下步
无进位
无进位
取208后两位，把2进到下步
取169后两位，把1进到下步
取156后两位，把1进到下步
无进位
取117后两位，把1进到下步
无进位
逐位相加
13
04
34
78
26
08
69
56
52
17
39
13
由此得1/23等于0.0434782608695652173913……0434782608695652173913，由这个表可以看出，对位数是几位，那么逐步退位相加的退位也是几位，1/3时是一位一位的退，1/23时是两位两位的退！ 
大家可以用以上的方式，求出别的以1为被除数的循环节！ 
如果被除数大于1，那么就用对位数乘以被乘数（倍乘的倍数与以1为被乘数时一样），再进行倍乘逐步退位相加（逐步退位相加的退位位数也与以1为被乘数时的一样，）！以2/23为例如下表： 
13*被乘数2=26
26*3=78
78*3=234
34*3+2=104
04*3+1=13
13*3=39
39*3=117
17*3+1=52
52*3=156
56*3+1=169
69*3+1=208
08*3+2=26
这一步出现了26，与对位数相同，说明已经循环了一个循环节！所以在这里前面加小数点！
取208后两位，把2进到下步
取169后两位，把1进到下步
取156后两位，把1进到下步
无进位
取117后两位，把1进到下步
无进位
无进位
取104后两位，把1进到下步
取234后两位，把2进到下步
无进位
逐位相加
26
08
69
56
52
17
39
13
04
34
78
26
由此得出，2/23=0.0869565217391304347826…………0869565217391304347826 
如果计算的数在前面进行了化偶或者消5分解运算，则也需要对对位数进行除以2或者除以5进行分解，化偶化了几次或者消5消了几次，对对位数也要进行同样的分解计算几次！（用分解出来的数进行倍乘逐步退位相加计算），然后记住计算出来后的数的小数点位数，在最后再进行相对的调整！ 
如果要计算某些非纯循环小数的算式时，则需要进行回调： 
第六步：回调： 
当用对位互换倍乘数进行如：1/6；1/56等等计算时，会发现这种算法与常规算法算出来的值不太一样，这是因为还没有对此类小数进行回调运算；以1/6为例，常规算法得0.16………………6，用这种算得0.6……65，当逐步退位相加算出第二次倍乘值出现了也还没有出现第二次对位数，也就是一个循环节实际上已经结束，那么 这时就应该结束倍乘运算，进入回调运算，回调运算方法如下： 
在出现第二次倍乘值的前一次值（真对位数）来减在算式中最早出现的那个数（假对位数），得出的数与（真对位数的位置对调（注意，如果减出来的数值的位数少于对位数的位数，那么在这个数的前面加0，直到位数相等为止！） 
第七步：9入（这个入是四舍五入的入意思）： 
9入就是如果计算出来的循环节全部由9组成，则对其从最后一位开始加1计算 ； 
比如用这种算法算出来的1/1，或者1/2或者1/5，1/32，等等会成为，1/1=0.9…………9，1/2=0.49…………9；1/5=0.19…………9；1/32=0.031249…………9；那么进行加1计算，得1/1=1；1/2=0.5；1/5=0.2；1/32=0.03125！ 
第八步：根据前几步的运算调整好小数点的位置！后续这里我为大家提供1000万以内的对位互换组合Excel.VBA代码，（请先在工作薄里建立4张工作表）！供大家后续研究：
Sub 对位互换()
Dim a!, b!, c$, ws%, d$, jj$, x!, l!, sj(9999999) As String, sj1(9999999) As String
sj(1) = "9"
sj(3) = "3"
sj(7) = "7"
sj(9) = "1"
For a = 11 To 9999999
If Right(CStr(a), 1) <> 1 Then
ws = Len(CStr(a))
jj = String(ws, "9")
c = CStr(Right(sj(Right(CStr(a), ws - 1)), ws - 1))
If Len(c) < ws - 1 Then c = String(ws - Len(c) - 1, "0") & c
For b = 0 To 9
d = a * (b & c)
If Right(d, ws) = jj Then
sj(a) = b & c
sj(b & c) = a
If ws = 8 Then
c = 100000000
ElseIf ws = 7 Then
c = 10000000
ElseIf ws = 6 Then
c = 1000000
ElseIf ws = 5 Then
c = 100000
ElseIf ws = 4 Then
c = 10000
ElseIf ws = 3 Then
c = 1000
ElseIf ws = 2 Then
c = 100
ElseIf ws = 1 Then
c = 10
End If
sj1(a) = a & ";" & sj(a) & "=" & (d + 1) / c
Exit For
End If
Next b
End If
Next a
sj1(1) = "1;9=1"
sj1(3) = "3;3=1"
sj1(7) = "7;7=5"
sj1(9) = "9;1=1"
x = 3
For a = 1 To 9999999 Step 10
l = l + 1
Sheet1. Cells(x, l) = sj1(a)
If l = 10 Then
l = 0
x = x + 1
End If
Next a
l = 0
x = 3
For a = 3 To 9999999 Step 10
l = l + 1
Sheet2.Cells(x, l) = sj1(a)
If l = 10 Then
l = 0
x = x + 1
End If
Next a
x = 3
For a = 7 To 9999999 Step 10
l = l + 1
Sheet3.Cells(x, l) = sj1(a)
If l = 10 Then
l = 0
x = x + 1
End If
Next a
x = 3
For a = 9 To 9999999 Step 10
l = l + 1
Sheet4.Cells(x, l) = sj1(a)
If l = 10 Then
l = 0
x = x + 1
End If
Next a
MsgBox "计算完毕"
End Sub
另外，还发现了在对位互换数的数值之间还存在着等距差值关系： 
如下表： 
0
1
2
3
4
5
6
7
8
9
十位数数值：
1
01
81
61
41
21
01
81
61
41
21
3
89
29
69
09
49
89
29
69
09
49
7
49
09
69
29
89
49
09
69
29
89
9
21
41
61
81
01
21
41
61
81
01
尾数数值
差值
愿我们以前人的成就以及知识为基石，用我们的创新和发现来添砖加瓦，让科学的高峰更高些！ 
发现者：中华人民共和国浙江省丽水市缙云县五云镇洋潭头村（原项山村）： 朱雄亮 
发现时间：2011年11月 
发表时间：2011年12月03日