Bài tập về vòng lặp

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,930
Những ai đã từng xem qua bài viết này: Giới thiệu Cơ bản về vòng lặp For . . . next của sư phụ ptm0412 giờ hãy cùng làm 1 vài bài tập từ đơn giản đến nâng cao nhé
Xin mở màn bằng 1 bài tập sau:

Bài tập 01:

Hãy tính xem từ năm 1900 đến nay có bao nhiêu ngày thuộc dạng THỨ SÁU NGÀY 13
------------------------
Các bạn ai có bài tập gì hay xin post lên đây nhé! Cảm ơn
 
Chỉnh sửa lần cuối bởi điều hành viên:
Nhập 1 giá trị N. Cho biết có bao nhiêu số nguyên tố trong dãy số 1,2,…,N. Cho hiển thị các số nguyên tố đó.

=> Câu này mình phải làm như thế nào đây mọi người. Mình thử dùng vòng lặp For...Next với hàm Select Case nhưng không dùng được.
bác đã làm như thế nào rồi mà báo không được, chỉ cần for next là đủ. Quan trọng là thuật toán định nghĩa số nguyên tố của bác nó như thế nào mà thôi.
 
Upvote 0
Bài này là bài mà các thầy cô dạy lập trình rất khoái làm đề tài bắt HS làm.
Bạn chỉ cần tìm những người đã học C/C++, xin bài của họ, dịch ra VBA là được.
 
Upvote 0
bác đã làm như thế nào rồi mà báo không được, chỉ cần for next là đủ. Quan trọng là thuật toán định nghĩa số nguyên tố của bác nó như thế nào mà thôi.

Mình làm như vậy nè, xuất ra kết quả thì chẳng có gì hết
Sub Kiem_Tra()
Dim So, i As Integer
Dim KT As String

So = Range("B1").Value
KT = Range("B2").Value

For i = 1 To 12
Select Case So
Case 2, 3, 5, 7, 11
KT = "Co tong cong 5 so nguyen to"
End Select
Exit For
Next

End Sub
 
Upvote 0
Mình làm như vậy nè, xuất ra kết quả thì chẳng có gì hết

Code bạn sai nên không ra kết quả được.
Những cái sai này là cơ bản mọi người ngại hướng dẫn vì phải giải thích nhiều thứ, nên theo tôi bạn nên tìm hiểu lại lý thuyết kỹ hơn rồi làm lại bài thực hành này.
Tôi cũng bắt đầu VBA từ đây For Next , bạn tìm hiểu nha hy vọng luyện xong topic đó bạn sẽ không phải hỏi lại bài này --=0
 
Upvote 0
Nhập 1 giá trị N. Cho biết có bao nhiêu số nguyên tố trong dãy số 1,2,…,N. Cho hiển thị các số nguyên tố đó.

=> Câu này mình phải làm như thế nào đây mọi người. Mình thử dùng vòng lặp For...Next với hàm Select Case nhưng không dùng được.

Bạn thử đoạn sau nhé.
Nhập số N tại ô B1
PHP:
Sub so_nguyen_to()
    Dim n As Long
    Dim coll     As Collection
    Dim m()    As Long
    Dim x       As Long
    Dim y       As Long
    Dim i           As Long
    n = Sheet1.Range("B1").Value  'Nhap so N can xac dinh cac so nguyen to
    Set coll = New Collection
    ReDim m(1 To 1.1 * n / (Log(n) - 2))
    For i = 2 To n
        coll.Add Item:=i, Key:=CStr(i)
    Next i
     On Error Resume Next
    Do While coll.Count
        y = y + 1
        x = coll(1)
        m(y) = x
        coll.Remove 1
        For i = 2 To n \ x
            coll.Remove CStr(i * x)
        Next i
    Loop
    Range("A1").Resize(y).Value = WorksheetFunction.Transpose(m)
End Sub
 
Upvote 0
File bài tập mình nè bạn.
Biến So=B1 mà B1 có giá trị là Số nên biến So ="Số"
Select Case So ' cái này là chuỗi
Case 2, 3, 5, 7, 11
KT = "Co tong cong 5 so nguyen to"' cái này sẽ không bao giờ xãy ra
End Select
cái code trên không bao giờ sãy ra vì không bao giờ đúng đk
dùng for làm gì? không có tác dụng gì hết
 
Upvote 0
...
cái code trên không bao giờ sãy ra vì không bao giờ đúng đk
dùng for làm gì? không có tác dụng gì hết

Vấn đề không chỉ riêng ở cái code. Chủ thớt hầu như không biết cách tìm số nguyên tố theo lý thuyết toán học.

Theo đúng bài toán tìm số nguyên tố thì người ta viết một function, trong function ấy có một vòng lặp để xét xem số có phải là số nguyên tố hay không.

Nhưng đấy là lý thuyết, chỉ xét 1 số.

Vì đề bài này là "tìm những số nguyên tố <= N", cho nên kết quả sẽ là 1 mảng các số ấy. Và thuật toán có thể tối ưu hoá bằng cách dùng các số đã tìm ra để thử số mới. Nói cách khác:

- Để tìm một số có phải là số nguyên tố hay không, người ta lần lượt thử xem nó có chia chẵn cho các số nhỏ hơn nó. Tức là xét xem X có chia chẵn cho 2 -> X-1
- Thuật toán được cải tiến theo nguyên tắc số chia có tính chất đảo nghịch, nếu X chia chẵn cho a thì X cũng chia chẵn cho X/a. Vì vậy ta chỉ cần xét từ 2 -> X^(1/2) --- căn bậc 2 của X
- Thuật toán sẽ được cải tiến theo lý thuyết nếu X chia chẵn cho a*b thì X cũng chia chẵn cho cả a vf b. Vì vậy ta chỉ cần xét chia chẵn cho những số nguyên tố đã biết.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử đoạn sau nhé.
Nhập số N tại ô B1
PHP:
Sub so_nguyen_to()
    Dim n As Long
    Dim coll     As Collection
    Dim m()    As Long
    Dim x       As Long
    Dim y       As Long
    Dim i           As Long
    n = Sheet1.Range("B1").Value  'Nhap so N can xac dinh cac so nguyen to
    Set coll = New Collection
    ReDim m(1 To 1.1 * n / (Log(n) - 2))
    For i = 2 To n
        coll.Add Item:=i, Key:=CStr(i)
    Next i
     On Error Resume Next
    Do While coll.Count
        y = y + 1
        x = coll(1)
        m(y) = x
        coll.Remove 1
        For i = 2 To n \ x
            coll.Remove CStr(i * x)
        Next i
    Loop
    Range("A1").Resize(y).Value = WorksheetFunction.Transpose(m)
End Sub

Em đang căn bản For Next, Bác đưa Collection, Array, Do White ... , em không ngất mới là lạ **~** --=0 -+*/
 
Upvote 0
Em đang căn bản For Next, Bác đưa Collection, Array, Do White ... , em không ngất mới là lạ **~** --=0 -+*/
For......Next thì cụ "gồ" có chỉ (đúng hay không cũng chẳng có biết)
Mã:
Function IsPrime(Num As Single) As Boolean
Dim i As Long
    If Num < 2 Or (Num <> 2 And Num Mod 2 = 0) Or _
       Num <> Int(Num) Then Exit Function
         For i = 3 To Sqr(Num) Step 2
            If Num Mod i = 0 Then Exit Function
         Next
     IsPrime = True
End Function
Code để chạy:
Mã:
Sub Main()
Dim i As Long, j As Long
    j = 1
    For i = 1 To 100
        If IsPrime(i) Then
            Cells(j, 1) = i
            j = j + 1
        End If
    Next i
End Sub
 
Upvote 0
...
Code để chạy:
Mã:
Sub Main()
Dim i As Long, j As Long
    j = 1
    For i = 1 To 100
        If IsPrime(i) Then
            Cells(j, 1) = i
            j = j + 1
        End If
    Next i
End Sub

Code này sai, ta biết sau số 3, chỉ có số lẻ mới có khả năng là số nguyên tố. Vì vậy, vòng lặp chỉ bắt đầu từ 3, bước 2. Giảm thiểu được một nửa số lần xét.
 
Upvote 0
Code này sai, ta biết sau số 3, chỉ có số lẻ mới có khả năng là số nguyên tố. Vì vậy, vòng lặp chỉ bắt đầu từ 3, bước 2. Giảm thiểu được một nửa số lần xét.
Thật ra code trên đâu có chạy được đâu ta. Cho nên sai là điều bình thường cơ mà (Sai từ lúc khai báo biến, vòng lặp chưa được đả động tới.)
 
Upvote 0
Nhập 1 giá trị N. Cho biết có bao nhiêu số nguyên tố trong dãy số 1,2,…,N. Cho hiển thị các số nguyên tố đó.

=> Câu này mình phải làm như thế nào đây mọi người. Mình thử dùng vòng lặp For...Next với hàm Select Case nhưng không dùng được.
Bài toán tìm số nguyên tố là bài toán khá hay, và "cơ bản":
Ta nên có 1 hàm đệ quy để kiểm tra tính "nguyên tố" của số liệu đầu vào
và hàm khác để duyệt qua các số rồi đưa ra kết quả
 
Upvote 0
Bạn có thể làm như sau:
Hàm kiểm tra số nguyên tố (dựa vào tính chất đã được bác VetMini phân tích)
[gpecode=vb]
Function Nguyento(n As Integer, f As Integer)
If f < 2 Then f = 2
If n <= 1 Then
Nguyento = 1
ElseIf f ^ 2 > n Then
Nguyento = 1
ElseIf n Mod f = 0 Then
Nguyento = 0
Else
Nguyento = Nguyento(n, f + 1)
End If
End Function
[/gpecode]

và hàm để xuất ra kết quả:

[gpecode=vb]
Function Ketqua(n As Integer)
Dim i As Integer
For i = 1 To n
If Nguyento(i, 2) = 1 Then Ketqua = Ketqua & Nguyento(i, 2) * i & ", "
Next
Ketqua = Left(Ketqua, Len(Ketqua) - 2)
End Function[/gpecode]
 
Upvote 0
Mã:
Function PrimeCollection(n As Integer) As String
[COLOR=#008000]' returns a comma delimited string[/COLOR]
[COLOR=#008000]' denoting a list of prime numbers less than or equal to n[/COLOR]
If n < 2 Then
    PrimeCollection = ""
    Exit Function
End If
Dim prColl() As Integer, prCount As Integer
ReDim prColl(1 To 1)
prColl(1) = 2 [COLOR=#008000]' 2 is always the first prime[/COLOR]
prCount = 1
PrimeCollection = "2"
Dim num As Integer, prIdx As Integer
[COLOR=#008000]' loop thru all numbers from 3 to n,[/COLOR]
[COLOR=#008000]' skipping even no's since we already know they are non-primes[/COLOR]
For num = 3 To n Step 2
[COLOR=#008000]    ' check this value against the current list of primes[/COLOR]
    For prIdx = 1 To prCount
        If num Mod prColl(prIdx) = 0 Then Exit For[COLOR=#008000] ' not a prime[/COLOR]
    Next prIdx
    If prIdx > prCount Then
[COLOR=#008000]        ' the above loop did not exit prematurely[/COLOR]
[COLOR=#008000]        ' thus, num is a prime[/COLOR]
        prCount = prCount + 1
        ReDim Preserve prColl(1 To prCount)
        prColl(prCount) = num
        PrimeCollection = PrimeCollection & "," & CStr(num)
    End If
Next num
End Function
 
Upvote 0
giảm thêm vài trường hợp

Mã:
Dim prColl() As Integer, prCount As Integer, isPm As Boolean
ReDim prColl(1 To 1)
prColl(1) = 2 ' 2 is always the first prime
prCount = 1
PrimeCollection = "2"
Dim num As Integer, prIdx As Integer
' loop thru all numbers from 3 to n,
' skipping even no's since we already know they are non-primes
For num = 3 To n Step 2
    isPm = True
    ' check this value against the current list of primes
    For prIdx = 1 To prCount
        If prColl(prIdx) <= num / 2 Then
            If num Mod prColl(prIdx) = 0 Then
                isPm = False
                Exit For ' not a prime
            End If
        Else
            Exit For
        End If
    Next prIdx
    If isPm Then
        ' the above loop did not exit prematurely
        ' thus, num is a prime
        
        prCount = prCount + 1
        ReDim Preserve prColl(1 To prCount)
        prColl(prCount) = num
        PrimeCollection = PrimeCollection & "," & CStr(num)
    End If
Next num
End Function
 
Upvote 0
Web KT
Back
Top Bottom