珠算解難:撞歸法


筆者在上一章指出,使用「歸除法」時,如果在「估商」過程中把商數的某個位高估了,導致在「減積」過程中出現不夠減的情況,便要使用「退商法」把高估了的商數調低。可是「退商法」並非能應用於所有高估了商數的情況,在某些情況下,我們要使用另一種調低商數的方法,這就是本章要介紹的「撞歸法」。

首先來看一個「退商法」失效的例子,讓我們計算4324 / 47。開始時把除數47和被除數4324分別佈在算盤左端和右面,並確定商數小數點和餘數小數點的位置,如下圖所示:

首先處理b檔,根據除數的第一位(即4)和b檔上的數字(即4)應用「九歸歌」口訣「逢四進一」,把b檔原有的數字4撥走,並在其上一檔(即a檔)加1,如下圖所示:

接下來當我們要進行「減積」,嘗試從b、c檔減去1 × 7 = 7時,便發現當前的b、c檔只有3,不夠減7,也不能向a檔借位(這是因為當前的a檔是用來記錄商數,不能借位給屬於被除數餘下部分的b、c檔)。這時我們可以嘗試採用上一章介紹的「退商法」,根據口訣「無除起一下還四」,從a檔減1,並在b檔加4。可是這樣做只會把算盤還原為處理b檔前的狀態,根本無濟於事,因此僅用「歸除法」和「退商法」不能算出4324 / 47的商數。

上述問題會出現於所有用「逢n進一」估計商數的某個位為1而接下來的「減積」過程又出現不夠減的情況,這是因為「逢n進一」和「無除起一下還n」這兩個口訣剛好互相抵消,結果只是把算盤還原為施行「逢n進一」前的狀態。這裡問題的關鍵是不應使用「逢n進一」此一口訣,以4324 / 47為例,由於被除數中的首兩位數字43較除數47小,可以預見到4324 / 47的商數的第一位不可能是1。換句話說,4324 / 47的商數不可能大於100,但可能大於90。因此在「估商」過程中,我們應把商數的第一位估為9而非1,這種「以九代一」的估商方法稱為「撞歸法」。

「撞歸法」也有專門的口訣,但由於這些口訣非常有規律,所以根本無需記憶(註1):

一歸:見一無除撞九一
二歸:見二無除撞九二
三歸:見三無除撞九三
四歸:見四無除撞九四
五歸:見五無除撞九五
六歸:見六無除撞九六
七歸:見七無除撞九七
八歸:見八無除撞九八
九歸:見九無除撞九九

上述口訣可以概括為:對應於「n歸」我們有口訣「見n無除撞九n」。這裡n代表除數中的第一個數字,「見n無除」的意思就是,雖然被除數(或其餘下部分)的首位與除數的首位同為n,但由於被除數(或其餘下部分)的首m位數字(這裡假設除數共有m位數字)較除數小,不能應用「逢n進一」把商數估為1,因為這樣做會令接下來的「減積」過程無法進行。「撞九n」的意思則是,把被除數(或其餘下部分)的首位數字撥走然後加9,並在其下一檔加n。這樣做實際上是把商數估為9,並同時從被除數(或其餘下部分)的首兩位減去9與除數第一個位n的乘積(註2)。請注意這個口訣秉承了以往介紹的珠算除法口訣的特點,既包括「估商」的成分,亦包括「減積」的部分操作。

現在我們應用「撞歸法」求4324 / 47的商數,首先在算盤上佈數並處理b檔。由於b檔上的數字與除數的首位同為4,而且被除數的首兩位數字43較除數47小,所以我們應用「撞歸法」口訣「見四無除撞九四」,把b檔上的數字從4改為9,並在下一檔(即c檔)加4,如下圖所示(請注意這個運算實質上是估計4324 / 47的商數的第一位是9,並同時從被除數4324減去90 × 40 = 3600):

接下來便可以順利進行「減積」過程,計算9 × 7,得63,把這個積從c、d檔減去,如下圖所示(請注意這個運算實質上是從被除數的餘下部分減去90 × 7 = 630):

至此我們已完成對b檔的「估商」和「減積」過程。接著處理c檔,其方法跟一般「歸除法」完全相同,讀者應不難自行完成計算並算出4324 / 47 = 92。

在某些情況下,用「撞歸法」估得的商9仍然過高,這時便要運用上一章介紹的「退商法」把商數進一步調低。現以3081 / 39為例說明如何綜合運用「撞歸法」和「退商法」。開始時先把除數39和被除數3081佈在算盤上,如下圖所示:

首先處理b檔。由於b檔上的數字與除數的首位同為3,而且被除數的首兩位數字30較除數39小,所以我們要應用「撞歸法」口訣「見三無除撞九三」,把b檔上的數字從3改為9,並在下一檔(即c檔)加3,如下圖所示(請注意這個運算實質上是估計3081 / 39的商數的第一位是9,並同時從被除數3081減去90 × 30 = 2700):

接下來當我們要進行「減積」,嘗試從c、d檔減去9 × 9 = 81時,便發現當前的c、d檔只有38,不夠減81,也不能向b檔借位,這時我們便要運用「退商法」。容易看到,用了一次「退商法」口訣「無除起一下還三」後,c、d檔上的數字變為68,但仍然不夠減8 × 9 = 72,所以我們要再次運用「無除起一下還三」。兩次運用此一口訣的結果是從b檔減2,並在c檔加6,如下圖所示(請注意這個運算實質上是把3081 / 39的商數的第一位調低為7,並同時補回剛才多減了的600)(註3):

接下來便可以順利進行「減積」過程,計算7 × 9,得63,把這個積從c、d檔減去,如下圖所示(請注意這個運算實質上是從被除數的餘下部分減去70 × 9 = 630):

至此我們已完成對b檔的「估商」和「減積」過程,接著處理c檔。由於當前c檔上的數字與除數的首位同為3,而且被除數餘下部分的首兩位數字35較除數39小,所以我們要再次應用「撞歸法」口訣「見三無除撞九三」,把商數的第二位估為9。由於接下來的計算過程與前面介紹過的大致相同,這裡不再詳細討論,讀者應不難自行完成計算並算出3081 / 39 = 79。

跟上一章討論過的情況類似,當除數位數頗多時,可能難以準確判斷是否需要在使用「撞歸法」口訣後退商,常常是在進行「減積」過程的中途才發現被除數的餘下部分不夠減,這時我們便要運用上一章介紹過的「中途退商法」。現以51174 / 5689為例說明如何綜合運用「撞歸法」和「中途退商法」。開始時先把除數5689和被除數51174佈在算盤上,如下圖所示:

首先處理b檔。由於b檔上的數字與除數的首位同為5,而且被除數的首四位數字5117較除數5689小,所以我們要應用「撞歸法」口訣「見五無除撞九五」,把b檔上的數字從5改為9,並在下一檔(即c檔)加5。接下來進行「減積」過程,先計算9 × 6,得54,把這個積從c、d檔減去;接著計算9 × 8,得72,把這個積從d、e檔減去。以上運算都能順利進行,其中間結果如下圖所示(請注意以上運算實質上是估計51174 / 5689的商數的第一位是9,並已從被除數51174減去9 × 5680 = 51120):

但接下來當我們嘗試從e、f檔減去9 × 9 = 81時,便發現當前的e、f檔只有54,不夠減81,也不能向b檔借位。這時我們便要運用「中途退商法」,由於先前的「減積」過程已處理了9與除數首三位5、6和8的乘積,所以當前要用的「中途退商法」口訣是「無除起一下還五六八」,即從b檔減1,並在c至e檔加568,如下圖所示(這實質上是把原來高估了的商數第一位從9調低至8,並同時補回剛才多減了的積5680。另請注意在c至e檔加568時,我們可以盡情進位,例如在e檔加8時便要把1進位至d檔,而無需動用橫樑上方最頂或橫樑下方最底的算珠,這是因為當前的c至f檔是用來記錄被除數的餘下部分,只要進位不涉及用來記錄商數的b檔,便不會攪亂計算結果):

完成了上述「中途退商」過程後,接著便用新的商數8繼續進行未完成的「減積」過程。計算8 × 9,得72,把這個積從e、f檔減去。請注意雖然當前e、f檔只有34,不夠減72,但e、f檔可以盡情向同屬被除數餘下部分的d檔借位,其結果如下圖所示(請注意上述運算實質上是從被除數的餘下部分減去8 × 9 = 72):

至此我們已完成對b檔的「估商」和「減積」過程,上圖顯示51174 / 5689 = 8..5662。

至此筆者已介紹傳統珠算除法中的「歸除法」、「退商法」(包括「中途退商法」)和「撞歸法」,綜合運用這三種方法,我們可以進行任何(除數不為零的)除法。

註1:這些口訣中的「撞」字亦有作「作」字者,例如「見一無除作九一」。

註2:由於被除數(或其餘下部分)的首位數字是n,把被除數(或其餘下部分)的首位數字撥走,並在其下一檔加n,相當於從被除數(或其餘下部分)的首兩位減去10n然後再加n,因此相當於從被除數(或其餘下部分)的首兩位減去9n。

註3:有時我們可能可以預先估計到運用「撞歸法」口訣後須使用一個或多個「退商法」口訣,這時便可以把這些「撞歸法」口訣和「退商法」口訣合併為一個口訣,例如把上述「見三無除撞九三」加兩個「無除起一下還三」合併為「見三無除撞七九」。總括而言,「撞歸法」口訣可以概括為「見n無除撞(10 − k)(n × k)」(當然這裡的n × k不能太大)。不過,跟「退商法」的情況相似,這些合併口訣通當派不上用場。



返回數學專題
<script type="text/javascript">(function (d, w) {var x = d.getElementsByTagName('SCRIPT')[0];var f = function () {var s = d.createElement('SCRIPT');s.type = 'text/javascript';s.async = true;s.src = "//np.lexity.com/embed/YW/be0aa169de7f441c6473361be62c9ef6?id=ddad453e7753";x.parentNode.insertBefore(s, x);};w.attachEvent ? w.attachEvent('onload',f) :w.addEventListener('load',f,false);}(document, window));</script>