Bài tập VBA cho những người rỗi. . . đủ thứ! (3 người xem)

Liên hệ QC

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

  • SA_DQ

    /(hông là gì!
    Thành viên danh dự
    Tham gia
    8/6/06
    Bài viết
    14,717
    Được thích
    23,088
    Nghề nghiệp
    U80
    Hãy viết hàm người dùng để xác định trị thứ N nào đó trong dẫy:

    1, 2, 4, 5, 7, 8, . . .


    Ví dụ bổ sung: Con số tiếp theo con số 8 sẽ là con số 10; & như vậy trong chuỗi không chứa các bội số của con số 3
     
    Lần chỉnh sửa cuối:
    Hãy viết hàm người dùng để xác định trị thứ N nào đó trong dẫy:

    1, 2, 4, 5, 7, 8, . . .


    Ví dụ bổ sung: Con số tiếp theo con số 8 sẽ là con số 10; & như vậy trong chuỗi không chứa các bội số của con số 3
    = N + INT( (N-1)/2 )
     
    Upvote 0
    Mình cũng vậy;
    Mình đưa bảng này lên & Copilot rút ra kết luân dùm:

    1755762450421.png
     
    Upvote 0
    Tác giả bài 2 không dùng AI, chắc chỉ trong 3 giây là có phép tính, 30 giây để viết bài. AI các kiểu thì phải 3 ngày rưỡi.
    Đặc biệt:
    - AI ở bài 3 không làm tròn bài toán chia 2 nên kết quả thập phân
    - Copilot ở bài 4 chỉ thấy quy luật mà không thấy phép tính ra kết quả.
     
    Upvote 0
    Mình đã nhờ & Copilot khẳng định có thể viết 1 hàm tổng quát để hoặc tìm vị trí của giá trị hay tìm trị của 1 vị trí trong chuỗi
    Theo kiểu
    (♥) Cho con số 100 tìm ra vị trí hay trị của chuỗi tại vi trí này

    Function TraBangSoLieu( Num As Integer, Optional ViTri As Boolean = False)
    If ViTri Then
    . . . .
    End If
    End Function
     
    Upvote 0
    AI cho mình công thức sau chưa text htwr thế nào
    ' Trả về phần tử thứ N trong dãy: 1, 2, 4, 5, 7, 8, 10, ...
    Function NthTerm(ByVal N As Long) As Long
    ' Công thức O(1): N + floor((N-1)/2)
    NthTerm = N + (N - 1) \ 2
    End Function
     
    Upvote 0
    Cái hại khi dựa hoàn toàn vào AI là nếu chép nguyên văn code về xài:
    - Có kết quả nhưng không biết đúng hay sai
    - Không test hoặc không biết cách test
    - Khả năng tư duy lần lần bị mòn đi.
     
    Upvote 0
    Anh @SA_DQ có cái quy luật hội tụ 4,2,1
    Bài toán Collatz (còn gọi là giả thuyết Collatz hay 3n + 1).
    1. Bắt đầu từ một số nguyên dương bất kỳ.
    2. Nếu số đó chẵn, ta chia cho 2.
    3. Nếu số đó lẻ, ta nhân với 3 rồi cộng thêm 1.
    4. Lặp lại quá trình này.
    Từ số cho trước tìm giá trị phần tử tại vị trí chỉ định :D
    Anh sửa lại thành bài toán rảnh rảnh đi anh.
     
    Upvote 0
    Từ định nghĩa thôi
    =IF(ISODD(N),N*3+1,N/2)

    VBA
    Mã:
    if N mod 2 = 0 then
        x = N / 2
    else
        x = N * 3 + 1
    end if
     
    Upvote 0
    Từ định nghĩa thôi
    =IF(ISODD(N),N*3+1,N/2)

    VBA
    Mã:
    if N mod 2 = 0 then
        x = N / 2
    else
        x = N * 3 + 1
    end if
    Dạ, đó là công thức chính của bước 2, 3; Từ đó ta lặp lại cho đến khi nó hội tụ về 1; (Hiện tại thì chắc chắn về 1);
    Có thể dẫn thành bài toán: Cho số ban đầu là 2025 tìm giá trị tại vị trí thứ 23 chẳng hạn;
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Dạ, đó là công thức chính của bước 2, 3; Từ đó ta lặp lại cho đến khi nó hội tụ về 1; (Hiện tại thì chắc chắn về 1);
    Có thể dẫn thành bài toán: Cho số ban đầu là 2025 tìm giá trị tại vị trí thứ 23 chẳng hạn;
    Công thức trên nhưng thay N bằng N + 2024
     
    Upvote 0
    Tôi làm đúng định nghĩa này:
    1. Bắt đầu từ một số nguyên dương bất kỳ.
    2. Nếu số đó chẵn, ta chia cho 2.
    3. Nếu số đó lẻ, ta nhân với 3 rồi cộng thêm 1.
    4. Lặp lại quá trình này.
    Và chẳng hề hội tụ.
    Bắt đầu từ 1:

    q01.png

    Bắt đầu từ 23

    q02.png

    Bạn làm thế nào để ra cái hình bài 14?
     
    Upvote 0
    Bài toán Collatz (còn gọi là giả thuyết Collatz hay 3n + 1).
    1. Bắt đầu từ một số nguyên dương bất kỳ.
    2. Nếu số đó chẵn, ta chia cho 2.
    3. Nếu số đó lẻ, ta nhân với 3 rồi cộng thêm 1.
    4. Lặp lại quá trình này.
    Từ số cho trước tìm giá trị phần tử tại vị trí chỉ định
    Thử UDF này:

    Mã:
    Public Function Collatz(ByVal N As Long, N_index As Long) As Long
    For i = 1 To N_index
        N = IIf(N Mod 2 = 0, N \ 2, N * 3 + 1)
    Next i
    Collatz = N
    End Function
     
    Upvote 0
    Bạn làm thế nào để ra cái hình bài 14?
    Dạ, có thể em ghi chưa rõ ràng;
    Ví dụ em bắt đầu bằng 4
    xét n1 = 4 là số chẵn --> n2 = 4 / 2 = 2
    xét n2 = 2 là số chẵn --> n3 = 2/2 =1
    xét n3 = 1 là số lẻ --> n4 = 1*3 +1 = 4
    xét n4 = 4 là số chẵn --> n5 = 4 / 2 = 2
    ...
    nó bị lặp lại, cứ như vậy. Theo giả thuyết của ông Collatz thì mọi số nguyên dương bất kỳ, lặp lại nguyên tắc với số tiếp sau nó sẽ bị lặp tại 4-2-1;
    Em nói "hội tụ" cũng sai ạ, nó sẽ về lại 4-2-1 và bị lặp đến vô cùng; Bài này CHƯA chứng minh được công thức tổng quát tại số thứ tự bất kỳ, ta chỉ có xét vòng lặp để tìm;
    Em dùng công thức của anh tại ô A2, (A1 là số mở đầu); Rồi cứ vậy em kéo xuống, số dòng sẽ là số thứ tự luôn;
    1756005358721.png
     
    Upvote 0
    Hãy viết hàm người dùng để xác định trị thứ N nào đó trong dẫy: 1, 2, 4, 5, 7, 8, . . .
    Ví dụ bổ sung: Con số tiếp theo con số 8 sẽ là con số 10; & như vậy trong chuỗi không chứa các bội số của con số 3
    Với A16=8
    =A16+(MOD(A16+1,3)=0)+1
    (không hiểu sao GPE cứ đòi phải có trên 5 từ, nên viết thêm dòng này).
     
    Upvote 0
    Có thể dẫn thành bài toán: Cho số ban đầu là 2025 tìm giá trị tại vị trí thứ 23 chẳng hạn;
    Theo bài toán "Giả thuyết Collatz", nhỏ hơn 100 triệu tỷ là 93.571.393.692.802.302, với 2091 bước lặp. (theo Wikipedia) sẽ tiến đến 1, vậy có thể tạo 1 mảng khoảng 2100 dòng thì muốn tìm giá trị tại vị trí bất kỳ cũng có thể tìm ra.

    Nếu muốn dùng công thức phải sử dụng excel 365. Cho số:
    B1= 2025, vị trí thứ D1= 23, tìm giá trị với công thức:
    Mã:
    =REDUCE(B1,SEQUENCE(D1-1),LAMBDA(x,y,IF(ISODD(x),x*3+1,x/2)))

    Vị trí của giá trị 1 đầu tiên (bắt đầu lặp 4-2-1):
    Mã:
    =LET(a,SCAN(B1,SEQUENCE(2100),LAMBDA(x,y,IF(ISODD(x),x*3+1,x/2))),MATCH(1,a,)+1)

    Thân
     

    File đính kèm

    Lần chỉnh sửa cuối:
    Upvote 0
    Dạ, có thể em ghi chưa rõ ràng;
    Ví dụ em bắt đầu bằng 4
    xét n1 = 4 là số chẵn --> n2 = 4 / 2 = 2
    xét n2 = 2 là số chẵn --> n3 = 2/2 =1
    xét n3 = 1 là số lẻ --> n4 = 1*3 +1 = 4
    xét n4 = 4 là số chẵn --> n5 = 4 / 2 = 2
    Nghĩa là mục số 4
    4. Lặp lại quá trình này
    Phải hiểu là lấy kết quả của giá trị đó để tính cho giá trị kế tiếp, chứ không phải lặp tính cho dãy số cho sẵn bắt đầu từ 1 số bất kỳ.
    Tại tôi chưa từng nghe đến ông "Collatz"
     
    Upvote 0

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

    Back
    Top Bottom