前言
對位互換倍乘倒算法是:循環小數倒算法之——《化偶、消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: 比如求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日