constrexim7
Thành viên mới
- Tham gia
- 20/8/07
- Bài viết
- 7
- Được thích
- 0
Dạ, không phải kế toán ạ. Cái này liên quan tý đến lĩnh vực xây dựng ạ.Học sinh làm bài tập hay kế toán làm phù phép hoá đơn đây?
Bài nầy làm đề thi toán quốc tế được đóDạ, không phải kế toán ạ. Cái này liên quan tý đến lĩnh vực xây dựng ạ.
Em tưởng viết VBA là được nhỉ. Vì em không biết viết VBA nên đành phải nhờ cao thủ. Vấn đề là chỉ cần tổng Số lượng dãy số tỏa mãn thôi ạ. Passcal thi ngày xưa học quên hết rồi. Hu hu. Cao thủ nào giúp hộ em cái.Bài nầy làm đề thi toán quốc tế được đó
Anh @HieuCD giúp em với.Mình tưởng viết VBA là được nhỉ. Vì mình không biết viết VBA nên đành phải nhờ cao thủ. Vấn đề là chỉ cần tổng Số lượng dãy số tỏa mãn thôi. Passcal thi ngày xưa học quên hết rồi. Hu hu. Cao thủ nào giúp hộ em cái.
Dùng hàm tự tạo, lưu ý tổ hợp lớn sẽ chạy chậmNhờ Anh chị diễn đàn giúp em bài toán sau:
Có dẫy số 5 phần tử, mỗi phần tử là 1 dãy số tự nhiên cho trước giống nhau.
Câu hỏi là tính SỐ LƯỢNG các dẫy số có tổng bằng một số cho trước.
Chân thành cảm ơn anh chị!
Function GPE(ByVal xMin As Long, ByVal xMax As Long, ByVal k As Byte, ByVal Tong As Long)
Dim Arr As Variant
Dim N As Long, i As Long, j As Byte, tmp As Long, kq As Long
N = xMax - xMin + 1
Arr = Tohop(N, k)
For i = LBound(Arr) To UBound(Arr)
tmp = 0
For j = 1 To N
If Mid(Arr(i), j, 1) = "1" Then tmp = tmp + xMin + j - 1
Next j
If tmp = Tong Then kq = kq + 1
Next i
GPE = kq
End Function
Private Function Tohop(ByVal N As Integer, ByVal k As Integer) As Variant
'tao to hop N chap k kha nang
If N = k Then Tohop = Array(String(k, "1")): Exit Function
Dim Arr As Variant, A As String, j As Long, p As Long, s As Long
ReDim Arr(1 To Application.Combin(N, k))
A = String(k, "1") & String(N - k, "0")
p = 1: Arr(p) = A
trolai:
j = InStrRev(A, "1")
Mid(A, j, 1) = "0"
Mid(A, j + 1, s + 1) = String(s + 1, "1")
s = 0: p = p + 1: Arr(p) = A
If InStr(j + 1, A, "0") = 0 Then
s = N - j
If s = k Then Tohop = Arr: Exit Function
Mid(A, j + 1, s) = String(s, "0")
End If
GoTo trolai
End Function
Cảm ơn @HieuCD ạ, quả thật tổ hợp lớn hơn 1 tý chạy chậm thậtDùng hàm tự tạo, lưu ý tổ hợp lớn sẽ chạy chậm
=GPE(giá trị nhỏ nhất, giá trị lớn nhất, Số lượng số cộng, Tổng)
Mã:Function GPE(ByVal xMin As Long, ByVal xMax As Long, ByVal k As Byte, ByVal Tong As Long) Dim Arr As Variant Dim N As Long, i As Long, j As Byte, tmp As Long, kq As Long N = xMax - xMin + 1 Arr = Tohop(N, k) For i = LBound(Arr) To UBound(Arr) tmp = 0 For j = 1 To N If Mid(Arr(i), j, 1) = "1" Then tmp = tmp + xMin + j - 1 Next j If tmp = Tong Then kq = kq + 1 Next i GPE = kq End Function Private Function Tohop(ByVal N As Integer, ByVal k As Integer) As Variant 'tao to hop N chap k kha nang If N = k Then Tohop = Array(String(k, "1")): Exit Function Dim Arr As Variant, A As String, j As Long, p As Long, s As Long ReDim Arr(1 To Application.Combin(N, k)) A = String(k, "1") & String(N - k, "0") p = 1: Arr(p) = A trolai: j = InStrRev(A, "1") Mid(A, j, 1) = "0" Mid(A, j + 1, s + 1) = String(s + 1, "1") s = 0: p = p + 1: Arr(p) = A If InStr(j + 1, A, "0") = 0 Then s = N - j If s = k Then Tohop = Arr: Exit Function Mid(A, j + 1, s) = String(s, "0") End If GoTo trolai End Function
Mã:... trolai: j = InStrRev(A, "1") Mid(A, j, 1) = "0" Mid(A, j + 1, s + 1) = String(s + 1, "1") s = 0: p = p + 1: Arr(p) = A If InStr(j + 1, A, "0") = 0 Then s = N - j If s = k Then Tohop = Arr: Exit Function Mid(A, j + 1, s) = String(s, "0") End If GoTo trolai
Cám ơn bạn, lúc đầu mình xét điều kiện giá trị biến luôn đúng, nhưng thấy phải thêm một xử lý nên mới dùng Goto, không nghỉ ra lệnh "Do While True"Code goto "trở lại" thường được người ta thể hiện bằng vòng lặp
Do While True ' vòng lặp vô tận, ngừoi đọc tự biết bên trong có 1 lệnh exit
j = InStrRev(A, "1")
Mid(A, j, 1) = "0"
Mid(A, j + 1, s + 1) = String(s + 1, "1")
s = 0: p = p + 1: Arr(p) = A
If InStr(j + 1, A, "0") = 0 Then
s = N - j
If s = k Then Tohop = Arr: Exit Do
Mid(A, j + 1, s) = String(s, "0")
End If
Loop