2018年12月15日 星期六

BASIC 叫用 BASIC


BASIC 叫用 BASIC


Ching-Tang Tseng
Hamilton, New Zealand
16 December 2018
http://forthfornight.blogspot.com

先貼示程式再進行解說:

8 integers D N L I S T P count

: test          
basic
10 let p = 0
20 let N = T
30 let D = N mod 2
40 if D = 0 then 220
50 let D = N mod 3
60 if D = 0 then 220

70 let L = sqrt ( N ) + 1
80 for I = 6 to L step 6
90 let D = N mod ( I - 1 )
100 if D = 0 then 210
110 let D = N mod ( I + 1 )
120 if D = 0 then 210
130 next I

140 let P = 1
150 goto 300

210 run 2drop
220 let P = 0
300 end
;

\ testing is started from 8, jump over 2, 3, 5, 7.
: main
basic
10 print " Input a specified number S = "
20 inputi S
30 let count = 4
40 let T = 8

130 run test
140 if P = 1 then 160
150 goto 180
160 let count = count + 1
170 if count = S then 210
180 let T = T + 1
190 goto -130

210 print N
220 end
;

main

Input a specified number S =
? 6

                  13  OK
main

Input a specified number S =
? 101

                 547  OK
main

Input a specified number S =
? 1001

                7927  OK
main

Input a specified number S =
? 10001

              104743  OK
main

Input a specified number S =
? 100001

             1299721  OK
main

Input a specified number S =
? 1000001

            15485867  OK




此前,本網頁經常貼示的展示程式,大部份都是只須單一個 BASIC 型式的程式就能完成的成果‧

這一次,換個方式,使用一個 BASIC 型式的程式 ,直接叫用另個 BASIC 型式的程式,展示求解問題的方法‧

問題很簡單: 第幾個質數是多少?


舉例而言,質數的序列是這樣的: 2, 3, 5, 7, 11, 13, 17, 19…等等,.

我們稱第5個質數是11,那麼,第一百萬零一個質數,應該是多少?

這種問題,不用費腦筋去想了,非用程式來解不可,上列展示就是我寫的程式‧

質數問題在電腦程式界出現時,通常都以不要錢的方式,當作公益軟體,提供大家使用與參考‧我也不例外,它不能用來賺錢,卻對世人有益‧

拿質數來問問題,也變化多端,列出所有的質數可以當問題,列出一段數字區間的質數也可以當問題,一個數字是不是質數?也能當問題,甚至於拿一堆質數任意炒作後問結果,也都能夠拿來當問題‧

這幾十年來,我寫過也收集過無數與質數問題有關的程式了,網上也有無數的資訊探討質數的問題‧

我還曾發現美國田納西大學把32位元以下能表示的質數,拿來建表,當作可被搜索獲得的參考資料‧這樣的資源,有點像早年大家使用之三角函數的函數表,是個早已不再需要的東西‧印成大本的書,就浪費了大量的紙張,貼進大量的網頁,也浪費了龐大的網上資源空間‧

有感於此,我在設計這個展示程式時,花費了一點心思,採用不建質數表的方式達到目的‧不管你問第幾個質數,都不查表,直接算出來‧

上列名為test 的程式,實際上是一個原本我就發展完成後庫存起來留用的程式,原來的用途只做判斷一個任意輸入的數字是不是質數?列用在此處時,它的執行結果,簡單修正為若是質數,就把變數 P 的內容設定為  1,否則為 0 .

第二個主程式 main 則以簡單清楚的流程,顯示了找到指定質數的方法,這樣寫程式,實在不需要再進行細部的解說了,程式放它50年,到時,我仍然能夠輕鬆的看懂‧

展示程式時,小小群聚的程式,前後分開一列,就能更清楚地看懂彼此的關係,也讓能夠任意GOTO指令的功能呈現自然的規矩‧

能夠使用 BASIC 叫用 BASIC的特殊性能,化解了BASIC 程式語言曾被大家詬病為麵條式規格的缺點‧

最後,必須強調的是,我若不說,大家必定很難理解,這樣的BASIC 式性能,程式的流程,在許多地方都任意穿透了結構性邊界,系統卻還能夠正常執行,不用FORTH來設計,確實很難實現‧





沒有留言: