ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 447|ตอบกลับ: 0

[VB.NET] โค้ดการคำนวณหาค่า ห.ร.ม. และ ค่า ค.ร.น

[คัดลอกลิงก์]

320

กระทู้

512

โพสต์

6583

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6583





การคำนวณหาค่า ห.ร.ม. หรือ GCD (Greatest Common Divisor)
ห.ร.ม. หรือตัวหารร่วมมากของจำนวนเต็มสองจำนวน คือจำนวนเต็มมากที่สุดที่หารทั้งสองจำนวนนั้นได้โดยไม่เหลือเศษ สำหรับโค้ดชุดนี้ในการหาค่า ห.ร.ม. จะใช้วิธีการแบบยุคลิด (Euclidean Algorithm) โดยมีวิธีคิดคือ ให้นำเศษจากการหารในทุกๆครั้ง นำกลับมาเป็นตัวตั้งใหม่อีกรอบ จนกว่าเศษที่ได้จะมีค่าเป็น 0
  1.     ' / ฟังก์ชัน GCD (Greatest Common Divisor) ใช้ในการหาตัวหารร่วมมากที่สุดของสองจำนวน a และ b
  2.     ' / โดยใช้วิธีการแบบยุคลิด (Euclidean Algorithm) โดยมีขั้นตอนการทำงานดังนี้:
  3.     ' หาค่า GCD ของ a และ b (ด้วยการหารเอาเศษ หรือ Modulus)
  4.     ' 1.        a = 48, b = 18
  5.     ' 2.        b ≠ 0
  6.     '                   temp = 18   (เก็บค่านี้ไว้เพื่อเป็นตัวตั้งในรอบถัดไป)
  7.     '                   b = 48 Mod 18 (เหลือเศษ 12, b = 12)
  8.     '                   a = 18 (a = temp)
  9.     ' 3.        a = 18, b = 12
  10.     ' 4.        b ≠ 0
  11.     '                   temp = 12
  12.     '                   b = 18 Mod 12 (เหลือเศษ 6, b = 6)
  13.     '                   a = 12 (a = temp)
  14.     ' 5.        a = 12, b = 6
  15.     ' 6.        b ≠ 0
  16.     '                   temp = 6
  17.     '                   b = 12 Mod 6 (เหลือเศษ 0, b = 0)
  18.     '                   a = 6 (a = temp)
  19.     ' 7.        a = 6, b = 0
  20.     ' 8.        คืนค่า a = 6 เป็น GCD
  21.     ' / -------------------------------------------------------------------------------------------------
  22.     '// หา หรม.
  23.     Function GCD(a As Integer, b As Integer) As Integer
  24.         While b <> 0    '// ใช้เงื่อนไขจริง ให้ทำซ้ำ ตราบใดที่ b มีค่าไม่ใช่ 0
  25.             Dim temp As Integer = b
  26.             b = a Mod b '// ใช้การหารเอาเศษ ผลลัพธ์ที่ได้เก็บไว้ใน b
  27.             a = temp    '// นำค่าเดิมจาก b ไปเก็บไว้ที่ a เพื่อให้เป็นตัวตั้งต่อไป
  28.         End While
  29.         Return a
  30.     End Function
คัดลอกไปที่คลิปบอร์ด

ค.ร.น. หรือ LCM (Least Common Multiple) ตัวคูณร่วมน้อย มีนิยามว่า คือจำนวนเต็มบวกที่น้อยที่สุดที่หารด้วยแต่ละจำนวนลงตัว โดยมีสูตรว่า
LCM(a, b) = (a x b) \ GCD(a, b)
ดังนั้นเมื่อเราหาค่า ห.ร.ม. ได้ก็จะหาค่า ค.ร.น. ได้อย่างไม่ยาก
  1. '/ ฟังก์ชัน LCM (Least Common Multiple) ใช้ในการหาค่าตัวคูณร่วมน้อยที่สุดของสองจำนวน a และ b โดยใช้ผลลัพธ์จากฟังก์ชัน GCD ที่ได้
  2.     '/ อธิบายการทำงาน
  3.     '/ 1.        เริ่มต้น: รับค่า a และ b เข้ามาในฟังก์ชัน
  4.     '/ 2.        คำนวณ LCM: ใช้สูตร LCM(a, b) = (a x b) \ GCD(a, b)
  5.     '/                  คูณ a และ b เข้าด้วยกัน
  6.     '/                  หารด้วยค่าที่ได้จากฟังก์ชัน GCD(a, b)
  7.     '/ 3.        ผลลัพธ์: คืนค่าผลลัพธ์เป็นตัวคูณร่วมน้อยที่สุด (LCM)

  8.     '/ ตัวอย่าง
  9.     '/ หาค่า LCM ของ 48 และ 18
  10.     '/ 1.        หา GCD: จากตัวอย่างข้างต้น GCD(48, 18) = 6
  11.     '/ 2.        คำนวณ LCM:
  12.     '/                  LCM(48, 18) = 48 x 18 \ 6 = 144
  13.     '/ 3.        คืนค่า LCM = 144
  14.     ' / -------------------------------------------------------------------------------------------------
  15.     '// หา ครน.
  16.     Function LCM(a As Integer, b As Integer) As Integer
  17.         Return (a * b) \ GCD(a, b)  '// ใช้การหารตัดเศษ เพราะต้องการคำตอบเป็นเลขจำนวนเต็ม
  18.     End Function
คัดลอกไปที่คลิปบอร์ด

มาดูโค้ดฉบับเต็มกันเถอะ ...
  1. Public Class frmGcdLcmNumber

  2.     Private Sub frmGcdLcmNumber_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  3.         Call btnGenerate_Click(sender, e)
  4.     End Sub

  5.     ' / -------------------------------------------------------------------------------------------------
  6.     ' / ฟังก์ชัน GCD (Greatest Common Divisor) ใช้ในการหาตัวหารร่วมมากที่สุดของสองจำนวน a และ b
  7.     ' / โดยใช้วิธีการแบบยุคลิด (Euclidean Algorithm) โดยมีขั้นตอนการทำงานดังนี้:
  8.     ' หาค่า GCD ของ a และ b (ด้วยการหารเอาเศษ หรือ Modulus)
  9.     ' 1.        a = 48, b = 18
  10.     ' 2.        b ≠ 0
  11.     '                   temp = 18   (เก็บค่านี้ไว้เพื่อเป็นตัวตั้งในรอบถัดไป)
  12.     '                   b = 48 Mod 18 (เหลือเศษ 12, b = 12)
  13.     '                   a = 18 (a = temp)
  14.     ' 3.        a = 18, b = 12
  15.     ' 4.        b ≠ 0
  16.     '                   temp = 12
  17.     '                   b = 18 Mod 12 (เหลือเศษ 6, b = 6)
  18.     '                   a = 12 (a = temp)
  19.     ' 5.        a = 12, b = 6
  20.     ' 6.        b ≠ 0
  21.     '                   temp = 6
  22.     '                   b = 12 Mod 6 (เหลือเศษ 0, b = 0)
  23.     '                   a = 6 (a = temp)
  24.     ' 7.        a = 6, b = 0
  25.     ' 8.        คืนค่า a = 6 เป็น GCD
  26.     ' / -------------------------------------------------------------------------------------------------
  27.     '// หา หรม.
  28.     Function GCD(a As Integer, b As Integer) As Integer
  29.         While b <> 0    '// ใช้เงื่อนไขจริง ให้ทำซ้ำ ตราบใดที่ b มีค่าไม่ใช่ 0
  30.             Dim temp As Integer = b
  31.             b = a Mod b '// ใช้การหารเอาเศษ ผลลัพธ์ที่ได้เก็บไว้ใน b
  32.             a = temp    '// นำค่าเดิมจาก b ไปเก็บไว้ที่ a เพื่อให้เป็นตัวตั้งต่อไป
  33.         End While
  34.         Return a
  35.     End Function

  36.     ' / -------------------------------------------------------------------------------------------------
  37.     '/ ฟังก์ชัน LCM (Least Common Multiple) ใช้ในการหาค่าตัวคูณร่วมน้อยที่สุดของสองจำนวน a และ b โดยใช้ผลลัพธ์จากฟังก์ชัน GCD ที่ได้
  38.     '/ อธิบายการทำงาน
  39.     '/ 1.        เริ่มต้น: รับค่า a และ b เข้ามาในฟังก์ชัน
  40.     '/ 2.        คำนวณ LCM: ใช้สูตร LCM(a, b) = (a x b) \ GCD(a, b)
  41.     '/                  คูณ a และ b เข้าด้วยกัน
  42.     '/                  หารด้วยค่าที่ได้จากฟังก์ชัน GCD(a, b)
  43.     '/ 3.        ผลลัพธ์: คืนค่าผลลัพธ์เป็นตัวคูณร่วมน้อยที่สุด (LCM)

  44.     '/ ตัวอย่าง
  45.     '/ หาค่า LCM ของ 48 และ 18
  46.     '/ 1.        หา GCD: จากตัวอย่างข้างต้น GCD(48, 18) = 6
  47.     '/ 2.        คำนวณ LCM:
  48.     '/                  LCM(48, 18) = 48 x 18 \ 6 = 144
  49.     '/ 3.        คืนค่า LCM = 144
  50.     ' / -------------------------------------------------------------------------------------------------
  51.     '// หา ครน.
  52.     Function LCM(a As Integer, b As Integer) As Integer
  53.         Return (a * b) \ GCD(a, b)  '// ใช้การหารตัดเศษ เพราะต้องการคำตอบเป็นเลขจำนวนเต็ม
  54.     End Function

  55.     Private Sub btnProceed_Click(sender As System.Object, e As System.EventArgs) Handles btnProceed.Click
  56.         '// Validate the input values.
  57.         If txtNum1.Text = "" Or txtNum1.Text = "0" Or txtNum1.Text.Length = 0 Then txtNum1.Text = "1"
  58.         If txtNum2.Text = "" Or txtNum2.Text = "0" Or txtNum2.Text.Length = 0 Then txtNum2.Text = "1"
  59.         '// ส่งค่า a และ b ไป
  60.         Dim gcdNum As Integer = GCD(Val(txtNum1.Text), Val(txtNum2.Text))
  61.         Dim lcmNum As Integer = LCM(Val(txtNum1.Text), Val(txtNum2.Text))
  62.         '//
  63.         txtGCD.Text = gcdNum
  64.         txtLCM.Text = lcmNum
  65.         '//
  66.         txtNum1.Focus()
  67.         txtNum1.SelectAll() '// Highlight the text in txtNum1
  68.     End Sub

  69.     Private Sub btnGenerate_Click(sender As System.Object, e As System.EventArgs) Handles btnGenerate.Click
  70.         Dim rnd As New Random()
  71.         Dim randomNumber1 As Integer = rnd.Next(1, 100)
  72.         Dim randomNumber2 As Integer = RandomEvenNumber(rnd)    '// สุ่มตัวเลขให้เป็นเลขคู่เท่านั้น
  73.         txtNum1.Text = randomNumber1
  74.         txtNum2.Text = randomNumber2
  75.     End Sub

  76.     ' / -------------------------------------------------------------------------------------------------
  77.     ' / ต้องการสุ่มค่าออกมาให้เป็นเลขคู่เท่านั้น
  78.     Private Function RandomEvenNumber(rnd As Random) As Integer
  79.         Dim randomNumber As Integer = rnd.Next(1, 51) '// Generates a number between 1 and 50.
  80.         Return randomNumber * 2 '// Multiply by 2 to get an even number between 2 and 100.
  81.     End Function

  82.     Private Sub txtNum1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtNum1.KeyDown
  83.         If e.KeyCode = Keys.Enter Then
  84.             e.SuppressKeyPress = True '// Prevent the beep sound on Enter key press.
  85.             txtNum2.Focus()
  86.             txtNum2.SelectAll() '// Highlight the text in txtNum2.
  87.         End If
  88.     End Sub

  89.     Private Sub txtNum1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtNum1.KeyPress
  90.         If Asc(e.KeyChar) = 13 Then
  91.             e.Handled = True
  92.             SendKeys.Send("{TAB}")
  93.         Else
  94.             e.Handled = CheckDigitOnly(Asc(e.KeyChar))
  95.         End If
  96.     End Sub

  97.     Private Sub txtNum2_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtNum2.KeyPress
  98.         If Asc(e.KeyChar) = 13 Then
  99.             e.Handled = True
  100.             Call btnProceed_Click(sender, e)
  101.         Else
  102.             e.Handled = CheckDigitOnly(Asc(e.KeyChar))
  103.         End If
  104.     End Sub

  105.     Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
  106.         Me.Close()
  107.     End Sub

  108.     Private Sub frmGcdLcmNumber_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  109.         Me.Dispose()
  110.         GC.SuppressFinalize(Me)
  111.         End
  112.     End Sub

  113. #Region "FUNCTION"
  114.     ' / --------------------------------------------------------------------------------
  115.     ' / ฟังค์ชั่นในการป้อนเฉพาะค่าตัวเลขได้เท่านั้น
  116.     Function CheckDigitOnly(ByVal index As Integer) As Boolean
  117.         Select Case index
  118.             Case 48 To 57 ' เลข 0 - 9
  119.                 CheckDigitOnly = False
  120.             Case 8, 13 ' Backspace = 8, Enter = 13
  121.                 CheckDigitOnly = False
  122.             Case Else
  123.                 CheckDigitOnly = True
  124.         End Select
  125.     End Function
  126. #End Region
  127. End Class
คัดลอกไปที่คลิปบอร์ด

ดาวน์โหลดโค้ดต้นฉบับเต็ม VB.NET (2010) ได้ที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-11-27 21:22 , Processed in 0.201420 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้