|
![](http://www.g2gsoft.com/webboard/images/VBNet/euclidean.png)
![](http://www.g2gsoft.com/webboard/images/VBNet/euclid.png)
การคำนวณหาค่า ห.ร.ม. หรือ GCD (Greatest Common Divisor)
ห.ร.ม. หรือตัวหารร่วมมากของจำนวนเต็มสองจำนวน คือจำนวนเต็มมากที่สุดที่หารทั้งสองจำนวนนั้นได้โดยไม่เหลือเศษ สำหรับโค้ดชุดนี้ในการหาค่า ห.ร.ม. จะใช้วิธีการแบบยุคลิด (Euclidean Algorithm) โดยมีวิธีคิดคือ ให้นำเศษจากการหารในทุกๆครั้ง นำกลับมาเป็นตัวตั้งใหม่อีกรอบ จนกว่าเศษที่ได้จะมีค่าเป็น 0
- ' / ฟังก์ชัน GCD (Greatest Common Divisor) ใช้ในการหาตัวหารร่วมมากที่สุดของสองจำนวน a และ b
- ' / โดยใช้วิธีการแบบยุคลิด (Euclidean Algorithm) โดยมีขั้นตอนการทำงานดังนี้:
- ' หาค่า GCD ของ a และ b (ด้วยการหารเอาเศษ หรือ Modulus)
- ' 1. a = 48, b = 18
- ' 2. b ≠ 0
- ' temp = 18 (เก็บค่านี้ไว้เพื่อเป็นตัวตั้งในรอบถัดไป)
- ' b = 48 Mod 18 (เหลือเศษ 12, b = 12)
- ' a = 18 (a = temp)
- ' 3. a = 18, b = 12
- ' 4. b ≠ 0
- ' temp = 12
- ' b = 18 Mod 12 (เหลือเศษ 6, b = 6)
- ' a = 12 (a = temp)
- ' 5. a = 12, b = 6
- ' 6. b ≠ 0
- ' temp = 6
- ' b = 12 Mod 6 (เหลือเศษ 0, b = 0)
- ' a = 6 (a = temp)
- ' 7. a = 6, b = 0
- ' 8. คืนค่า a = 6 เป็น GCD
- ' / -------------------------------------------------------------------------------------------------
- '// หา หรม.
- Function GCD(a As Integer, b As Integer) As Integer
- While b <> 0 '// ใช้เงื่อนไขจริง ให้ทำซ้ำ ตราบใดที่ b มีค่าไม่ใช่ 0
- Dim temp As Integer = b
- b = a Mod b '// ใช้การหารเอาเศษ ผลลัพธ์ที่ได้เก็บไว้ใน b
- a = temp '// นำค่าเดิมจาก b ไปเก็บไว้ที่ a เพื่อให้เป็นตัวตั้งต่อไป
- End While
- Return a
- End Function
คัดลอกไปที่คลิปบอร์ด
ค.ร.น. หรือ LCM (Least Common Multiple) ตัวคูณร่วมน้อย มีนิยามว่า คือจำนวนเต็มบวกที่น้อยที่สุดที่หารด้วยแต่ละจำนวนลงตัว โดยมีสูตรว่า
LCM(a, b) = (a x b) \ GCD(a, b)
ดังนั้นเมื่อเราหาค่า ห.ร.ม. ได้ก็จะหาค่า ค.ร.น. ได้อย่างไม่ยาก
- '/ ฟังก์ชัน LCM (Least Common Multiple) ใช้ในการหาค่าตัวคูณร่วมน้อยที่สุดของสองจำนวน a และ b โดยใช้ผลลัพธ์จากฟังก์ชัน GCD ที่ได้
- '/ อธิบายการทำงาน
- '/ 1. เริ่มต้น: รับค่า a และ b เข้ามาในฟังก์ชัน
- '/ 2. คำนวณ LCM: ใช้สูตร LCM(a, b) = (a x b) \ GCD(a, b)
- '/ คูณ a และ b เข้าด้วยกัน
- '/ หารด้วยค่าที่ได้จากฟังก์ชัน GCD(a, b)
- '/ 3. ผลลัพธ์: คืนค่าผลลัพธ์เป็นตัวคูณร่วมน้อยที่สุด (LCM)
- '/ ตัวอย่าง
- '/ หาค่า LCM ของ 48 และ 18
- '/ 1. หา GCD: จากตัวอย่างข้างต้น GCD(48, 18) = 6
- '/ 2. คำนวณ LCM:
- '/ LCM(48, 18) = 48 x 18 \ 6 = 144
- '/ 3. คืนค่า LCM = 144
- ' / -------------------------------------------------------------------------------------------------
- '// หา ครน.
- Function LCM(a As Integer, b As Integer) As Integer
- Return (a * b) \ GCD(a, b) '// ใช้การหารตัดเศษ เพราะต้องการคำตอบเป็นเลขจำนวนเต็ม
- End Function
คัดลอกไปที่คลิปบอร์ด
มาดูโค้ดฉบับเต็มกันเถอะ ...
- Public Class frmGcdLcmNumber
- Private Sub frmGcdLcmNumber_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
- Call btnGenerate_Click(sender, e)
- End Sub
- ' / -------------------------------------------------------------------------------------------------
- ' / ฟังก์ชัน GCD (Greatest Common Divisor) ใช้ในการหาตัวหารร่วมมากที่สุดของสองจำนวน a และ b
- ' / โดยใช้วิธีการแบบยุคลิด (Euclidean Algorithm) โดยมีขั้นตอนการทำงานดังนี้:
- ' หาค่า GCD ของ a และ b (ด้วยการหารเอาเศษ หรือ Modulus)
- ' 1. a = 48, b = 18
- ' 2. b ≠ 0
- ' temp = 18 (เก็บค่านี้ไว้เพื่อเป็นตัวตั้งในรอบถัดไป)
- ' b = 48 Mod 18 (เหลือเศษ 12, b = 12)
- ' a = 18 (a = temp)
- ' 3. a = 18, b = 12
- ' 4. b ≠ 0
- ' temp = 12
- ' b = 18 Mod 12 (เหลือเศษ 6, b = 6)
- ' a = 12 (a = temp)
- ' 5. a = 12, b = 6
- ' 6. b ≠ 0
- ' temp = 6
- ' b = 12 Mod 6 (เหลือเศษ 0, b = 0)
- ' a = 6 (a = temp)
- ' 7. a = 6, b = 0
- ' 8. คืนค่า a = 6 เป็น GCD
- ' / -------------------------------------------------------------------------------------------------
- '// หา หรม.
- Function GCD(a As Integer, b As Integer) As Integer
- While b <> 0 '// ใช้เงื่อนไขจริง ให้ทำซ้ำ ตราบใดที่ b มีค่าไม่ใช่ 0
- Dim temp As Integer = b
- b = a Mod b '// ใช้การหารเอาเศษ ผลลัพธ์ที่ได้เก็บไว้ใน b
- a = temp '// นำค่าเดิมจาก b ไปเก็บไว้ที่ a เพื่อให้เป็นตัวตั้งต่อไป
- End While
- Return a
- End Function
- ' / -------------------------------------------------------------------------------------------------
- '/ ฟังก์ชัน LCM (Least Common Multiple) ใช้ในการหาค่าตัวคูณร่วมน้อยที่สุดของสองจำนวน a และ b โดยใช้ผลลัพธ์จากฟังก์ชัน GCD ที่ได้
- '/ อธิบายการทำงาน
- '/ 1. เริ่มต้น: รับค่า a และ b เข้ามาในฟังก์ชัน
- '/ 2. คำนวณ LCM: ใช้สูตร LCM(a, b) = (a x b) \ GCD(a, b)
- '/ คูณ a และ b เข้าด้วยกัน
- '/ หารด้วยค่าที่ได้จากฟังก์ชัน GCD(a, b)
- '/ 3. ผลลัพธ์: คืนค่าผลลัพธ์เป็นตัวคูณร่วมน้อยที่สุด (LCM)
- '/ ตัวอย่าง
- '/ หาค่า LCM ของ 48 และ 18
- '/ 1. หา GCD: จากตัวอย่างข้างต้น GCD(48, 18) = 6
- '/ 2. คำนวณ LCM:
- '/ LCM(48, 18) = 48 x 18 \ 6 = 144
- '/ 3. คืนค่า LCM = 144
- ' / -------------------------------------------------------------------------------------------------
- '// หา ครน.
- Function LCM(a As Integer, b As Integer) As Integer
- Return (a * b) \ GCD(a, b) '// ใช้การหารตัดเศษ เพราะต้องการคำตอบเป็นเลขจำนวนเต็ม
- End Function
- Private Sub btnProceed_Click(sender As System.Object, e As System.EventArgs) Handles btnProceed.Click
- '// Validate the input values.
- If txtNum1.Text = "" Or txtNum1.Text = "0" Or txtNum1.Text.Length = 0 Then txtNum1.Text = "1"
- If txtNum2.Text = "" Or txtNum2.Text = "0" Or txtNum2.Text.Length = 0 Then txtNum2.Text = "1"
- '// ส่งค่า a และ b ไป
- Dim gcdNum As Integer = GCD(Val(txtNum1.Text), Val(txtNum2.Text))
- Dim lcmNum As Integer = LCM(Val(txtNum1.Text), Val(txtNum2.Text))
- '//
- txtGCD.Text = gcdNum
- txtLCM.Text = lcmNum
- '//
- txtNum1.Focus()
- txtNum1.SelectAll() '// Highlight the text in txtNum1
- End Sub
- Private Sub btnGenerate_Click(sender As System.Object, e As System.EventArgs) Handles btnGenerate.Click
- Dim rnd As New Random()
- Dim randomNumber1 As Integer = rnd.Next(1, 100)
- Dim randomNumber2 As Integer = RandomEvenNumber(rnd) '// สุ่มตัวเลขให้เป็นเลขคู่เท่านั้น
- txtNum1.Text = randomNumber1
- txtNum2.Text = randomNumber2
- End Sub
- ' / -------------------------------------------------------------------------------------------------
- ' / ต้องการสุ่มค่าออกมาให้เป็นเลขคู่เท่านั้น
- Private Function RandomEvenNumber(rnd As Random) As Integer
- Dim randomNumber As Integer = rnd.Next(1, 51) '// Generates a number between 1 and 50.
- Return randomNumber * 2 '// Multiply by 2 to get an even number between 2 and 100.
- End Function
- Private Sub txtNum1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtNum1.KeyDown
- If e.KeyCode = Keys.Enter Then
- e.SuppressKeyPress = True '// Prevent the beep sound on Enter key press.
- txtNum2.Focus()
- txtNum2.SelectAll() '// Highlight the text in txtNum2.
- End If
- End Sub
- Private Sub txtNum1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtNum1.KeyPress
- If Asc(e.KeyChar) = 13 Then
- e.Handled = True
- SendKeys.Send("{TAB}")
- Else
- e.Handled = CheckDigitOnly(Asc(e.KeyChar))
- End If
- End Sub
- Private Sub txtNum2_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtNum2.KeyPress
- If Asc(e.KeyChar) = 13 Then
- e.Handled = True
- Call btnProceed_Click(sender, e)
- Else
- e.Handled = CheckDigitOnly(Asc(e.KeyChar))
- End If
- End Sub
- Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
- Me.Close()
- End Sub
- Private Sub frmGcdLcmNumber_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
- Me.Dispose()
- GC.SuppressFinalize(Me)
- End
- End Sub
- #Region "FUNCTION"
- ' / --------------------------------------------------------------------------------
- ' / ฟังค์ชั่นในการป้อนเฉพาะค่าตัวเลขได้เท่านั้น
- Function CheckDigitOnly(ByVal index As Integer) As Boolean
- Select Case index
- Case 48 To 57 ' เลข 0 - 9
- CheckDigitOnly = False
- Case 8, 13 ' Backspace = 8, Enter = 13
- CheckDigitOnly = False
- Case Else
- CheckDigitOnly = True
- End Select
- End Function
- #End Region
- End Class
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับเต็ม VB.NET (2010) ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|