Bài tập về vòng lặp (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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,974
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:
Hàm tìm chữ số lớn nhất trong một số nguyên
ví dụ
Số 123544 có chữ số lớn nhất là 5
Số 1328 có chữ số lớn nhất là 8
Số -9344 có chữ số lớn nhất là 9
Function solonnhat(n As Long) As Byte
Dim max As Byte
n = Abs(n)
max = 0
Do While (n > 0)
If (max < n Mod 10) Then
max = n Mod 10
End If
n = Int(n / 10)
Loop
solonnhat = max
End Function
 
Upvote 0
Có một câu lệnh có thể thay thế bằng

Mã:
[B]n = n \ 10[/B]

Chúc vui & hết sức cảm ơn bạn!
 
Lần chỉnh sửa cuối:
Upvote 0
Hàm tìm chữ số lớn nhất trong một số nguyên
ví dụ
Số 123544 có chữ số lớn nhất là 5
Số 1328 có chữ số lớn nhất là 8
Số -9344 có chữ số lớn nhất là 9


Lợi dụng hàm trên em viết thêm hàm đếm số chữ số lớn nhất trong 1 số
ví dụ
Số 347334 kết quả là 1 vì có 1 số 7(số 7 là lớn nhất)
Số -9394939 kết quả là 4 vì có 4 số 9(số 9 là số lớn nhất)
Function dem_sochu_solonnhat(n As Long) As Byte
Dim dem As Byte
Dim m As Long
Dim max As Byte
n = Abs(n)
m = n
dem = 0
max = solonnhat(m)
Do While (n > 0)
If (max = (n Mod 10)) Then
dem = dem + 1
End If
n = n \ 10
Loop
dem_sochu_solonnhat = dem
End Function
 
Upvote 0
Lợi dụng hàm trên em viết thêm hàm đếm số chữ số lớn nhất trong 1 số
ví dụ
Số 347334 kết quả là 1 vì có 1 số 7(số 7 là lớn nhất)
Số -9394939 kết quả là 4 vì có 4 số 9(số 9 là số lớn nhất)
Tôi chưa nghĩ ra được những trường hợp sẽ ứng dụng các hàm của bạn. Theo tôi thì một hàm tự tạo trước hết phải có tính hữu dụng cao, hơn nữa những hàm đó thì công thức Excel làm cũng được mà.
 
Upvote 0
Bài tập 02:
Nhập vào 1 số N nguyên dương, in ra sheet hiện hành trên 1 vùng N cột, N dòng bắt đầu từ ô A1 với vùng đó chứa các số tự nhiên từ 1 đến N*N theo vòng xoáy ốc.
Bài này C++ tôi giải quyết tốt, nhưng mà VBA thì chưa rõ lắm nên không biết chọn vùng như thế nào và cách đưa dữ liệu vào các ô ra sao hu hu
 
Lần chỉnh sửa cuối:
Upvote 0
Gì mà khóc như trẻ lên 3 thế? bài 23 và 24 đã giải và giải thích cặn kẽ rồi.
 
Upvote 0
Theo tôi với vòng lặp thì bài này có thể finish được rồi, 1 vòng lặp hay 2 vòng lặp thì số lượng phép toán là như nhau, các bạn có thể tìm hiểu thêm phương pháp không dùng vòng lặp(đệ quy) xem sao.
Liên quan đến vòng lặp thì thường là các bài liên quan đến xử lý mảng, sắp xếp, ma trận, xử lý chuỗi ... Tôi xin góp vui 1 bài như sau
Bài tập 02:
Nhập vào 1 số N nguyên dương, in ra sheet hiện hành trên 1 vùng N cột, N dòng bắt đầu từ ô A1 với vùng đó chứa các số tự nhiên từ 1 đến N*N theo vòng xoáy ốc. Ví dụ N=5 ta sẽ phải in ra sheet hiện hành là
|A|B|C|D|E
1|1|2|3|4|5
2|16|17|18|19|6
3|15|24|25|20|7
4|14|23|22|21|8
5|13|12|11|10|9

hihi cuối cùng mình cũng biết một ít VBA rồi mừng quá, mình cảm thấy rất vui khi chuyển từ ngôn ngữ C++ qua VBA tuy bài này Code rất tầm thường nhưng mình rất vui vì đã biết chuyển đổi từ C++ qua VBA, xin cảm ơn GPE

PHP:
Sub xoanoc()
    Dim n, a, b, c, d As Integer
    Range("a1:z100").Clear
    n = InputBox(" Nhap vao so nguyen, nho nhap dung nha", "Nhap")
    n = Val(n)
    a = 1
    b = 1
    c = n
    d = n
    t = 1
     Do While (t < n * n)
            For i = a To d - 1 Step 1
                Range("A1").Offset(b, i) = t
                t = t + 1
             Next i
    
            For i = b To d - 1
                Range("A1").Offset(i, c) = t
                t = t + 1
            Next i

            For i = c To a + 1 Step -1
                Range("A1").Offset(d, i) = t
                t = t + 1
            Next i

            For i = d To b + 1 Step -1
                Range("A1").Offset(i, a) = t
                t = t + 1
            Next i
            a = a + 1
            b = b + 1
            c = c - 1
            d = d - 1
        Loop

        If (n Mod 2 = 1) Then
            Range("A1").Offset(Int(n / 2) + 1, Int(n / 2) + 1) = n * n
        End If
End Sub

[PHP]
Private Sub CommandButton1_Click()
Call xoanoc
End Sub
[/PHP]
 
Upvote 0
hihi cuối cùng mình cũng biết một ít VBA rồi mừng quá, mình cảm thấy rất vui khi chuyển từ ngôn ngữ C++ qua VBA tuy bài này Code rất tầm thường nhưng mình rất vui vì đã biết chuyển đổi từ C++ qua VBA, xin cảm ơn GPE
/QUOTE]
Thuật toán trên rất hay và sáng tạo mà bạn nói rất tầm thường, vậy bạn có thể chuyển từ Do... Loop sang for ... next thử.
Do tôi chưa rành lắm về Do... Loop.
Cám ơn bạn.
 
Upvote 0
hihi cuối cùng mình cũng biết một ít VBA rồi mừng quá, mình cảm thấy rất vui khi chuyển từ ngôn ngữ C++ qua VBA tuy bài này Code rất tầm thường nhưng mình rất vui vì đã biết chuyển đổi từ C++ qua VBA, xin cảm ơn GPE
/QUOTE]
Thuật toán trên rất hay và sáng tạo mà bạn nói rất tầm thường, vậy bạn có thể chuyển từ Do... Loop sang for ... next thử.
Do tôi chưa rành lắm về Do... Loop.
Cám ơn bạn.

Gởi chị bài For Next
PHP:
Sub xoanoc()
    Dim n, a, b, c, d As Integer
    
    Range("a1:z100").Clear
    n = InputBox(" Nhap vao so nguyen, nho nhap dung nha", "Nhap")
    n = Val(n)
    
    a = 1
    b = 1
    c = n
    d = n
    t = 1
     For t = 1 To n * n
           If (t = n * n) Then Exit For
            For i = a To d - 1 Step 1
                Range("A1").Offset(b, i) = t
                t = t + 1
             Next i
    
            For i = b To d - 1
                Range("A1").Offset(i, c) = t
                t = t + 1
            Next i

            For i = c To a + 1 Step -1
                Range("A1").Offset(d, i) = t
                t = t + 1
            Next i

            For i = d To b + 1 Step -1
                Range("A1").Offset(i, a) = t
                t = t + 1
            Next i
            a = a + 1
            b = b + 1
            c = c - 1
            d = d - 1
            t = t - 1
        Next t

       If (n Mod 2 = 1) Then
            Range("A1").Offset(Int(n / 2) + 1, Int(n / 2) + 1) = n * n
        End If
End Sub
 
Upvote 0
PHP:
    a = 1
    b = 1
    c = n
    d = n
    t = 1
     For t = 1 To n * n
          If (t = n * n) Then Exit For
            For i = a To d - 1 Step 1
                Range("A1").Offset(b, i) = t
                t = t + 1
             Next i
    
            For i = b To d - 1
                Range("A1").Offset(i, c) = t
                t = t + 1
            Next i

            For i = c To a + 1 Step -1
                Range("A1").Offset(d, i) = t
                t = t + 1
            Next i

            For i = d To b + 1 Step -1
                Range("A1").Offset(i, a) = t
                t = t + 1
            Next i
            a = a + 1
            b = b + 1
            c = c - 1
            d = d - 1
            t = t - 1
        Next t

 ...
Hình như có gì chưa ổn

If (t = n * n) Then Exit For
Bạn chạy thử có OK. Tôi chưa run.
 
Upvote 0
Upvote 0
Sướng quá cuối cùng cũng làm được bài đếm số hậu trên bàn cờ rồi hihi, các cao thủ trên diễn đàn xem code và cho ý kiếm nha, xin cảm ơn, có file đính kèm
http://www.mediafire.com/?3wihn3w9985vlgl


PHP:
Sub nhap(A() As Integer, ByRef n As Integer)
    Dim i, j As Integer
    Randomize
    n = InputBox("nhap so nguyen duong n", "Nhap")
    For i = 1 To n
        For j = 1 To n
           A(i, j) = Round(Rnd * 100)
        Next j
     Next i
End Sub

Sub xuat(A() As Integer, n)
    Dim i, j As Integer
     For i = 1 To n
        For j = 1 To n
           Range("A1").Offset(i, j).Value = A(i, j)
        Next j
     Next i
End Sub
Function kthoanghau(A() As Integer, ByVal n As Integer, ByVal dong As Integer, ByVal cot As Integer)
    Dim flag As Byte
    Dim i, j As Integer
    flag = 1
    For i = 1 To n
        For j = 1 To n
            If (((i = dong) Or (j = cot) Or (i + j = dong + cot) Or (i - j = dong - cot)) And (A(i, j) > A(dong, cot))) Then
                   
             
                      flag = 0
             End If
         Next j
     Next i
   kthoanghau = flag
End Function
Function demhoanghau(A() As Integer, ByVal n As Integer)
    Dim i, j As Integer
    Dim dem As Byte
    dem = 0
     For i = 1 To n
        For j = 1 To n
           If (kthoanghau(A, n, i, j) = 1) Then
             dem = dem + 1
           End If
        Next j
     Next i
     demhoanghau = dem
End Function


PHP:
Private Sub CommandButton1_Click()
Dim A(100, 100) As Integer
Dim n As Integer
Range("A1:Z100").Clear
Call nhap(A(), n)
Call xuat(A(), n)
Range("c15").Value = demhoanghau(A, n)

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
for t=1 ...
t+t+1
không phải vậy đâu chị
t=t+1 đó
bài này em test rồi em mới đưa lên diến đàn đó chị
Ý anh ThuNghi là code của bạn có những dòng thừa không cần thiết có thể rút gọn. Ví dụ như trong đoạn này:
PHP:
t = 1
    For t = 1 To n * n
        If (t = n * n) Then Exit For
Dòng 1 thừa. Có thể bỏ đi
Dòng 2 và 3 sửa lại thành:
PHP:
For t = 1 To n * n - 1
Code của bạn có thể rút gọn lại thành như thế này:
PHP:
Sub xoanoc()
    Dim n As Long, a As Long, b As Long, i As Long, j As Long
    Range("A1:Z100").ClearContents
    n = InputBox("Nhap vao so nguyen, nho nhap dung nha", "Nhap")
    a = 1:    b = n:    t = 1
    For j = 1 To n \ 2
        For i = a To b - 1 Step 1
             Cells(a, i) = t
             Cells(i, b) = t + b - j
             Cells(b, n + 1 - i) = t + 2 * (b - j)
             Cells(n + 1 - i, a) = t + 3 * (b - j)
             t = t + 1
         Next i
         t = t + 3 * (b - j)
         a = a + 1:         b = b - 1
    Next
    If n Mod 2 Then Cells(n \ 2 + 1, n \ 2 + 1) = n * n
End Sub
Sướng quá cuối cùng cũng làm được bài đếm số hậu trên bàn cờ rồi hihi, các cao thủ trên diễn đàn xem code và cho ý kiếm nha, xin cảm ơn, có file đính kèm
Không hiểu code đó dùng để làm gì luôn. Chắc cao thủ mới hiểu được +-+-+-+
 
Upvote 0
tui làm mấy bài trên là ứng dụng vài vòng for cho tốt thôi, với lại tôi muốn học cách truyền tham số mảng vào hàm VBA , chỉ có vậy thôi,mỗi khi bạn viết bài nào đó thì bạn đã có thêm 1 tí tư duy cho mình rồi đó, còn ứng dụng thì chắc chắn sẽ có
 
Upvote 0
bài mới không nhiều , mà ngồi không cũng buồn nên viết bài bài tập vòng For để học hỏi thêm VBA
Bài này là tô màu các số nguyên tô trong 1 dãy số
PHP:
Sub nhap(A() As Long, n As Integer)
      Dim i, j As Integer
    Randomize
    n = InputBox("nhap so nguyen duong n", "Nhap")
    For i = 1 To n
        For j = 1 To n
           A(i, j) = Round(Rnd * 100)
        Next j
     Next i
End Sub

PHP:
Sub xuat(A() As Long, n As Integer)
    Dim i, j As Integer
     For i = 1 To n
        For j = 1 To n
           Range("A1").Offset(i, j).Value = A(i, j)
          If (ISPRIME_NUMBER(A(i, j)) = True) Then
                Range("A1").Offset(i, j).Font.Color = -16776961
                Range("A1").Offset(i, j).Font.Size = 12
                Range("A1").Offset(i, j).Font.Bold = True
           End If
        Next j
     Next i
End Sub


PHP:
Function ISPRIME_NUMBER(n As Long, Optional i As Long = 2) As Boolean
      If (n < 2) Then
                           ISPRIME_NUMBER = False
                   Exit Function
      ElseIf ((n < 4) Or (i > Sqr(n))) Then
                           ISPRIME_NUMBER = True
                   Exit Function
      ElseIf (n Mod i = 0) Then
                          ISPRIME_NUMBER = False
                  Exit Function
      Else
                      ISPRIME_NUMBER = ISPRIME_NUMBER(n, i + 1)
   End If
End Function

Chương trình chính
PHP:
Private Sub CommandButton1_Click()
Dim A(100, 100) As Long
Dim n As Integer
Range("A1:Z100").Clear
Call nhap(A(), n)
Call xuat(A(), n)
End Sub
 
Upvote 0
Bài tập vòng lặp

Em có bài toán tính lặp như sau:
Tính giá trị min của hàm: F=3X1^3+2X1^2+4X2^2-12X2+8
Với các điều kiện ràng buộc sau: X1^2-3X2+1<=2 và X1-2X2<=5
Yêu cầu bài toán là tìm giá trị MinF bằng cách dùng hàm tạo số ngẫu nhiên sau đó sau n vòng lặp sẽ tìm ra minF sau n lần này.
(Không dùng Solver)
Em cám ơn.
Em nghĩ thuật toán như sau:
1.Khởi tạo bộ số (X1,X2) ngẫu nhiên
2. Qua n lần lặp sẽ tính và so sánh F và các điều kiện ràng buộc
3.Thoả mãn kết quả => MinF
Nhưng e làm mà không được.
 
Upvote 0
Vòng lặp For...Next

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.
 
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á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
giảm thêm vài trường hợp

Mã:
...
        If prColl(prIdx) <= num / 2 Then
...

Trật rồi, nhiều bạn làm số nguyên tố bị cải thiện lầm chỗ này lắm.
Theo lý thuyết, nếu gọi n2 là căn 2 của n, và a*b = n thì hoặc a = b = n2; hoặc nếu a > n2 thì b < n2
Nếu cần giảm thiểu số lần xét thì chỉ cần xét tới căn bâc 2 của n là đủ, không cần phải tới n/2
 
Upvote 0
vâng up bài rồi em mới nhớ cái vụ đó . chỉ cần đi tới căn 2 của num là đủ . lâu ngày không "văn ôn võ luyện" . hihi
 
Upvote 0
Bài tập số nguyên tố là bài của IT thuần toán. Nó không liên quan gì đến Excel hay VBA cả.
Nó là một bài tập buộc HS phải suy nghĩ nhiều về thuật toán và phương pháp tối ưu số lần tính toán.
Tôi đã nhiều lần nói, từ "tối ưu" có tính chất tương đối. Một thuật toán chỉ có thể tối ưu trong một khoảng dữ liệu nào đó thôi. Khi thực hiện, người ta chọn thuật toán có vùng ưu rộng nhất.
VD: tuy so với căn 2 thì giảm thiểu được sô lần hơn so với chia 2; nhưng con toán lấy căn tốn nhiều sức máy hơn con toán chia 2. Vì vậy nếu số n nhỏ thì n/2 hiệu quả hơn.

Thầy cô nào ra bài tập này cho VBA là dốt toán và không có căn bản về tin học văn phòng.
 
Upvote 0
Vì đằng nào cũng dùng phép chia để tính num mod prcol(pridx) nên ta có thể làm như sau
For....
tmp=num/prcol(pridx)
If tmp=INT(tmp) then
Isprime=false
Exit Function
Elseif tmp<prcol(pridx)
Isprime=true
Exit Function
End If
Next
 
Upvote 0
Vì đằng nào cũng dùng phép chia để tính num mod prcol(pridx) nên ta có thể làm như sau
For....
tmp=num/prcol(pridx)
If tmp=INT(tmp) then
Isprime=false
Exit Function
Elseif tmp<prcol(pridx)
Isprime=true
Exit Function
End If
Next

Tên gọi của trị tmp trong trường hợp này là factor.
 
Upvote 0
em có giả thiết này mong các bác giúp đỡ
em có 4 biến a,x,z,t chạy từ 1 đến 100
biểu thức x*y/z*t so sánh với hằng số cho trước.
chọn 10 cặp giá trị gần đúng nhất với hằng số kia để từ đó để suy ra lựa chon x, y, x,t+-+-+-++-+-+-+
 
Lần chỉnh sửa cuối:
Upvote 0

Bài viết mới nhất

Back
Top Bottom