SOGO論壇

標題: 窮舉法應用 [列印本頁]

作者: SoaB    時間: 2020-7-30 14:30:51     標題: 窮舉法應用

發現新的玩具【V language】,用來還算順手,拿來練習。
注意這東東只能拿來玩…
  1. /*
  2.    中國古代數學家張丘建在他的《算經》
  3.    提出了一個著名的「百錢買百雞問題」,
  4.    雞翁一,值錢五,雞母一,值錢三,雞雛三,值錢一,
  5.    百錢買百雞,問翁、母、雛各幾何?

  6.    x = 翁
  7.    y = 母
  8.    z = 雛

  9.    5x+3y+z/3 =100(百錢)
  10.    x+y+z = 100(百雞)
  11.    0 <= x <= 100/5 ==> range = 20
  12.    0 <= y <= 100/3 ==> range = 33
  13.    0 <= z <= 100   ==> range = 100
  14. */
  15. module main

  16. fn main() {
  17.         mut x := 0
  18.         mut y := 0
  19.         mut z := 0
  20.         mut sum := 0
  21.         println("百錢買百雞問題")
  22.         for x = 0; x <= 20; x++ {
  23.                 for y = 0; y <= 33; y++ {
  24.                         for z = 0; z <= 100; z++ {
  25.                                 sum = 5 * x + 3 * y + z / 3
  26.                                 if sum == 100 && z % 3 == 0 && x + y + z == 100 {
  27.                                         println('翁:$x 母:$y 雛:$z')
  28.                                 }
  29.                         }
  30.                 }
  31.         }
  32. }
複製代碼

作者: SoaB    時間: 2020-7-31 15:46:39

再來一個 pi …
一樣玩玩而已裏面算法請Google。
  1. /*
  2. ================================================================
  3. calculate pi with n digits
  4. ================================================================
  5. */
  6. module main

  7. const (
  8.         scale   = 10000
  9.         arr_int = 20000
  10. )

  11. fn pi_digits(digits int) {
  12.         mut tm := 0
  13.         mut carry := 0
  14.         mut arr := [arr_int].repeat(arr_int + 1)
  15.         for i := digits; i > 0; i -= 4 {
  16.                 mut sum := 0
  17.                 for j := i; j > 0; j-- {
  18.                         sum = sum * j + scale * arr[j]
  19.                         arr[j] = sum % (j * 2 - 1)
  20.                         sum /= j * 2 - 1
  21.                 }
  22.                 tm = carry + sum / scale
  23.                 print('${tm:04d}')
  24.                 carry = sum % scale
  25.         }
  26. }

  27. fn main() {
  28.         pi_digits(20000)
  29. }
複製代碼

作者: akii    時間: 2020-8-3 05:25:15

SoaB 發表於 2020-7-31 15:46  
再來一個 pi …
一樣玩玩而已裏面算法請Google。

請問甚麼是 V language ? 有編譯器嗎?

作者: SoaB    時間: 2020-8-3 13:26:34

akii 發表於 2020-8-3 05:25  
請問甚麼是 V language ? 有編譯器嗎?

V
作者: SoaB    時間: 2020-8-3 21:37:16

小小的文字遊戲,有沒有人把它弄成H-GAME文字遊戲啊?
  1. module main

  2. import os

  3. struct Pagenode {
  4.         text    string
  5. mut:
  6.         choices &Choices
  7. }

  8. // /////////////////////////////////////////////////////////////////
  9. struct Choices {
  10.         cmd         string
  11.         description string
  12. mut:
  13.         next_node   &Pagenode
  14.         next_choice &Choices
  15. }

  16. fn new_page(text string) &Pagenode {
  17.         page := &Pagenode{text, 0}
  18.         return page
  19. }

  20. fn (mut node Pagenode) add_choice(cmd, description string, next_node &Pagenode) {
  21.         choice := &Choices{cmd, description, next_node, 0}
  22.         if node.choices == 0 {
  23.                 node.choices = choice
  24.         } else {
  25.                 mut current_choice := node.choices
  26.                 for current_choice.next_choice != 0 {
  27.                         current_choice = current_choice.next_choice
  28.                 }
  29.                 current_choice.next_choice = choice
  30.         }
  31. }

  32. fn (node Pagenode) render() {
  33.         println(node.text)
  34.         mut current_choice := node.choices
  35.         for current_choice != 0 {
  36.                 println(current_choice.cmd + ' : ' + current_choice.description)
  37.                 current_choice = current_choice.next_choice
  38.         }
  39. }

  40. fn (node Pagenode) execute_cmd(cmd string) &Pagenode {
  41.         mut current_choice := node.choices
  42.         for current_choice != 0 {
  43.                 if current_choice.cmd.to_lower() == cmd.to_lower() {
  44.                         return current_choice.next_node
  45.                 }
  46.                 current_choice = current_choice.next_choice
  47.         }
  48.         println('選個我看的懂的啦!')
  49.         return 0
  50. }

  51. fn (node Pagenode) play() {
  52.         node.render()
  53.         mut cmd := ''
  54.         if node.choices != 0 {
  55.                 for cmd.len < 1 {
  56.                         cmd = os.get_line().trim_space()
  57.                 }
  58.                 node.execute_cmd(cmd).play()
  59.         }
  60. }

  61. fn main() {
  62.         println('小白的冒險')
  63.         println('This is a nonesence damn story!!')
  64.         mut star := new_page('
  65.         嗯…一張開眼,你發現你在一個小小小的房間裏,昏暗的燈光下你看到有3個門…
  66.         驚不驚喜!!!
  67.         要不要開開看?
  68.         PS:不開就等著餓死吧!')
  69.         mut dark_room := new_page('伸手不見5指的房間')
  70.         mut dark_room_lit := new_page('有點小小亮光的房間')
  71.         grue := new_page('就是一個房間')
  72.         trap := new_page('哈一個該的陷阱!你死了。')
  73.         treasure := new_page('出○')
  74.         star.add_choice('N', '北門', dark_room)
  75.         star.add_choice('S', '南門', dark_room)
  76.         star.add_choice('E', '東門', trap)
  77.         dark_room.add_choice('S', '退回南門', grue)
  78.         dark_room.add_choice('O', '點亮臘燭!', dark_room_lit)
  79.         dark_room_lit.add_choice('N', '走北門', treasure)
  80.         dark_room_lit.add_choice('S', '走南門', star)
  81.         star.play()
  82.         println('結束了???')
  83. }
複製代碼

作者: ikj78i    時間: 2021-2-21 05:07:01

計算質數表的 Eratosthenes 篩選法應該也算是窮舉法吧?

假設想要列出小於 N 的質數,可以先由 2 開始把小於 N 的正整數一一列出,然後把 2 的倍數刪去。
之後再由 2 開始找到第一個沒被刪去的數,3,即為質數,再把 3 的倍數刪去。刪去之後再由 3 開始
,找到第一個沒被刪去的數,5,這就是下一個質數,再刪去 5 的倍數。然後由 5 開始,找到下一個
沒被刪去的數,7,7 就是下個質數……如此循環不已,直到 N 為止。
作者: SoaB    時間: 2021-2-27 20:05:34

也算是窮舉法的應用了…
程式如下…只取2-25中的質數…
  1. module main

  2. fn main() {
  3.         mut prime_num := []int{}
  4.         mut nums := [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]
  5.         println(nums)
  6.         for nums.len > 1 {
  7.                 prime_num << nums[0]
  8.                 nums = nums.filter(it % nums[0] != 0)
  9.         }
  10.         prime_num << nums[0]
  11.         println(prime_num)
  12. }
複製代碼





歡迎光臨 SOGO論壇 (https://oursogo.com/) Powered by OURSOGO.COM