Đố chơi đầu năm

Liên hệ QC
thứ tự các năm nhuận không đúng với thứ tự dòng cột ... không thể dùng vòng FOR đơn giản mà phải tính toán chỉ số dòng cột dành cho các năm LIÊN TIẾP.
Tại anh nhìn kỹ quá. Tôi thì chỉ cần nhìn tới chỗ năm nào để vào cột có thứ nấy (trong tuần) là làm luôn. Vì dùng weekday (không phải whiskey) nên có sẵn thứ tự cột.
Code có cao siêu gì đâu. Chẳng qua là anh thấy "cờ" đang vuột khỏi tay anh, người ta đang phất cờ lia lịa. Vì thế anh sốt ruột mà lao vào thôi. :D
Cũng có 1 chút chút :p :p . Tuy vậy tôi vẫn chủ trương thuật toán đơn giản, code cho rõ ràng dù cho có dài hơn người ta.
 
Tại anh nhìn kỹ quá. Tôi thì chỉ cần nhìn tới chỗ năm nào để vào cột có thứ nấy (trong tuần) là làm luôn. ...
Bài này, theo tôi phân tích thì nó đâu có cần dữ liệu năm. Chỉ cần biết năm nhuần đầu tiên (2024) và năm giới hạn cuối cùng (2099) thôi.

Dim dte As Date
For dte = DateSerial(2024, 2, 29) To DateSerial(2099) Step 365 * 4 + 1
' code ghi dte ra bảng ở đây
Next dte

1. Cái công thức trên trông hỗn đọn nhưng thực ra nó chỉ phải tính mỗi thứ 1 lần. Các giải thuật trước dây phải gọi hàm dateserial ít nhất 19 lần.
2. Vì năm không gồm năm đầu thế kỷ (chia chẵn 100) cho nên con số 365 * 4 + 1 là đúng 4 năm.

Có cả phần ghi ra bảng:

Dim ngayThu(1 To 7) As Long ' mảng ghi nhớ vị trí hiện tại ở mỗi cột
Dim rg As Range, thu As Long
Set rg = #WorkSheet#.Range("ô gì đó") ' ô này là ô bắt đầu ghi dữ liệu
rg.Cells(0, 1).Resize(1, 7).Value = Array("CN", "T2", "T3", "T4", "T5", "T6", "T7") ' tiêu đề, 0 có nghĩa là dòng trên nó
Dim dte As Date
For dte = DateSerial(2024, 2, 29) To DateSerial(2099, 2, 29) Step 365 * 4 + 1
' code ghi dte ra bảng ở đây
thu = Weekday(dte)
ngayThu(thu) = ngayThu(thu) + 1
rg.Cells(ngayThu(thu), thu) = dte
Next dte
 
Giành cho người chưa có bài đăng trong chuyên mục này.

Trăm trâu, trăm cỏ
Trâu đứng ăn năm
Trâu nằm ăn ba
Trâu zà lựm khượm
Ba con một bó

Xin các bạn đưa ra mọi đáp án có thể!

Chúc các bạn vui xuân hạnh phúc & vui vẻ!
 
Giành cho người chưa có bài đăng trong chuyên mục này.

Trăm trâu, trăm cỏ
Trâu đứng ăn năm
Trâu nằm ăn ba
Trâu zà lựm khượm
Ba con một bó

Xin các bạn đưa ra mọi đáp án có thể!

Chúc các bạn vui xuân hạnh phúc & vui vẻ!
Đang lúc chờ kết quả
Mã:
Option Explicit

Sub trau_co()
Dim i, j, k, x, z
Sheet1.UsedRange.Clear
For i = 1 To 96
    For j = 1 To 96
        For k = 3 To 98 Step 3
            x = i + j + k
            z = i * 5 + j * 3 + k / 3
            If x = 100 And z = 100 Then
                Sheet1.Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(1, 3) = Array(i, j, k)
            End If
        Next k
    Next j
Next i
End Sub
 
Bạn đang thiếu 1 nghiệm, 1 khi trước đó người ta đem 1 loại trâu nào đó giết thịt hết!
$$$$@
Có trường hợp đang ăn đứng chuyển thành ăn nằm không bác
Mã:
Option Explicit

Sub trau_co()
Dim i, j, k, x, z
Sheet1.UsedRange.Clear
For i = 0 To 100 Step 5
    For j = 0 To 100 Step 3
        For k = 3 To 100 Step 3
            x = i / 5 + j / 3 + k
            z = i + j + k / 3
            If x = 100 And z = 100 Then
                Sheet1.Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(1, 3) = Array(i / 5, j / 3, k)
            End If
        Next k
    Next j
Next i
End Sub
 
...
(1) Trăm trâu, trăm cỏ. (2) Trâu đứng ăn năm. (3) Trâu nằm ăn ba. (4) Trâu zà lựm khượm. Ba con một bó

Xin các bạn đưa ra mọi đáp án có thể!

Khoan nói chuyện đáp án. Nói chuyện phân tích đề trước đã.
"trâu" theo tiếng Việt là danh tự. Theo văn phạm thì danh tự số nhiều hay ít viết và đọc in hệt nhau, không hề phân biệt.
Câu (1) xác định rõ ràng 100X và 100Y
Từ 3 câu (2), (3), (4), ta có thể chia thêm X = Xd + Xn + Xg
ĐOÁN rằng câu hỏi là tìm d, n, g
d + n + g = 100
Nhưng câu (2) (3) không xác định rõ:
(i) Tất cả các trâu đứng chỉ ăn chung 5, tất cả trâu nằm chỉ ăn chung 3:
5 + 3 + (g/3) = 100
(ii) Các trâu đứng mỗi con ăn 5, các trâu nằm mỗi con ăn 3:
5*d + 3*n + g/3 = 100

Tức là ở đây có 2 đề bài chứ không phải 1.
 
Khoan nói chuyện đáp án. Nói chuyện phân tích đề trước đã.
"trâu" theo tiếng Việt là danh tự. Theo văn phạm thì danh tự số nhiều hay ít viết và đọc in hệt nhau, không hề phân biệt.
Câu (1) xác định rõ ràng 100X và 100Y
Từ 3 câu (2), (3), (4), ta có thể chia thêm X = Xd + Xn + Xg
ĐOÁN rằng câu hỏi là tìm d, n, g
d + n + g = 100
Nhưng câu (2) (3) không xác định rõ:
(i) Tất cả các trâu đứng chỉ ăn chung 5, tất cả trâu nằm chỉ ăn chung 3:
5 + 3 + (g/3) = 100
(ii) Các trâu đứng mỗi con ăn 5, các trâu nằm mỗi con ăn 3:
5*d + 3*n + g/3 = 100

Tức là ở đây có 2 đề bài chứ không phải 1.
Tôi không giỏi tiếng Việt đến mức này nhưng ngay từ đầu tôi đã thấy. Tôi bỏ qua nhưng bây giờ lại thấy. Ở đây nói chuyện giành giật cái gì đấy mọi người ơi.
 
Tôi quên mất.
Bài ấy đâu có nói trâu già không được quyền đứng hay nằm? Vậy là phải phân tích lại.

Tôi có nói là mình chậm tiêu. Đố mẹo hôm nay, cả tuần sau tôi mới nghiệm ra. :p
 
Đặt các ẩn Dg, Nm và Gia lần lượt là số trâu đứng, nằm và trâu già, ta lập được 2 phương trình :
Dg + Nm +Gia = 100 (1),
5Dg + 3 Nm + Gia/3 = 100 (2).
Khử ẩn Gia ta lấy (2) x 3, xong trừ cho (1) ta được:
14Dg + 8Nn = 200 (3)
Chia cả 2 vế của (3) cho 8 ta nhận đươc đẳng thức sau: 7xDg/4 + Nm = 25, (5).
Từ (5) ta có nhận xét: Dg < 25 (điều này có thể nhận xét ngay từ đề bài)
(& quan trọng để xài trong VBA là: ) Dg chỉ có thể là 0 hay bội số của 4
Vậy vòng lặp ngoài cùng cho trâu đứng (của bài 47) được rút ngăn lại chỉ là
For I = 0 to 24

Next I;

& phát huy chiến quả này, vòng lặp kế tiếp (cho trâu nằm) cũng chỉ là
For J =0 to 34 Step 3

Next J
Xin cảm ơn CHAOQUAY nhiều &
Chúc các bác vui vẻ nhân dịp xuân về!
 
Lần chỉnh sửa cuối:
... Từ (5) ta có nhận xét: Dg < 25 (điều này có thể nhận xét ngay từ đề bài)
....
Trời đất, bạn đi lòng vòng mấy lượt mới về đây.
Chận trên của các ẩn số có thể xác định bằng cách đặt hai ẩn số còn lại bằng 0.
5d + 3n + g/3 = 100 ==> d <= 20; n <= 33 ; g = 3t (t=0-33)
Điểm mấu chốt của bài toán là chúng ta tính trên số nguyên.
Nếu dùng VBA thì dùng thuật toán vét cạn dễ hiểu nhất. Và dùng thuật toán vét cạn thì phân tích rất dễ. Điểm phân tích duy nhất là số trâu già phải chia chẵn 3 (3 con là một đơn vị ăn)

1644722424702.png

Chú thích:
...
& phát huy chiến quả này, vòng lặp kế tiếp (cho trâu nằm) cũng chỉ là
For J =0 to 34 Step 3

Next J
...
Theo thuật toán vét cạn thì vòng lặp trong chỉ đi theo giới hạn được định ra bởi vòng lặp ngoài. Ở code trên, bạn sẽ thấy vòng lặp ngoài cùng xét số trâu già, {số trâu - trâu già} là số trâu không già. Vòng lặp trong xét trâu nằm cho nên nó chỉ tính tới {số trâu - trâu già}. Step có thể giúp giảm số một chút nhưng mất công phân tích số trâu nằm phải chia chẵn bao nhiêu. Vòng lặp thứ ba không cần thiết bởi vì nếu đã vét cạn g và n rồi thì d tự nhiên là {số trâu - g - n}. Con toán tôi dùng rất giản dị, biểu hiện đúng phương trình bài toán.
 
Web KT
Back
Top Bottom