Hỏi về xử lý mảng số nguyên (1 người xem)

Liên hệ QC

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

ruoitrau1987

Thành viên mới
Tham gia
21/12/11
Bài viết
27
Được thích
4
Xin các anh chị giúp đỡ

Em có 1 mảng đã được xác định là tập hợp của các số đã xác định nhỏ hơn 40

Ví dụ (2,5,6,8,22,34,39)

Làm thế nào để tạo được 1 mảng gồm các số còn lại từ 1 đến 40 (không bao gồm các số của mảng thứ nhất)

Em xin chân thành cảm ơn
 
Mình xin thêm vài điều kiện để bài toán đơn giản:
1./ Các số trong mảng là nguyên dương
2./ Mảng đang chứa trong vùng [B1:I5]
Lúc đó lời giải sẽ như sau:
PHP:
Sub TimMang()
 Dim Rng As Range, sRng As Range
 Dim J As Long, W As Long
 
 ReDim Arr(1 To 40, 1 To 1) As Integer
 Set Rng = [B1:I5]
 For J = 1 To 40
    Set sRng = Rng.Find(J, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        W = W + 1:                  Arr(W, 1) = J
    End If
 Next J
 If W Then
    [L1].Resize(W).Value = Arr()
 End If
End Sub
 
Upvote 0
Bạn xem qua hàm bên dưới, nếu bạn thấy phù hợp thì sử dụng
Hàm chỉ trả lại mảng còn lại, chưa biết nơi sẽ ghi ra kết quả
Bạn có thể nhập vào là một Array hoặc một Range
----------------------------------
PHP:
Private Sub test_TapDoiChieu()
  Dim Arr
  Arr = TapDoiChieu(1, 40, Array(2, 5, 6, 8, 22, 34, 39))
  'Arr = TapDoiChieu(1, 40, Range("...:..."))
End Sub
Function TapDoiChieu(Byval Tu&,Byval  Den&,Byval  MangDoiChieu) As Variant()
  Dim i&, k&, Con, Arr(), IsIn As Boolean
  For i = Tu To Den
    IsIn = False
    For Each Con In MangDoiChieu: If Con = i Then IsIn = True: Exit For: Next Con
    If Not IsIn Then ReDim Preserve Arr(k): Arr(k) = i: k = k + 1
  Next i
  TapDoiChieu = Arr
End Function
 
Upvote 0
Const NHONHAT = 1
Const TONHAT = 40
mang = Array(2,5,6,8,22,34,39)
Dim mangHieu() As Integer
Redim mangHieu(NHONHAT to TONHAT)
For i = LBound(mang) to UBound(mang)
mangHieu(mang(i)) = -999 ' trị gì cũng được, miễn là nhỏ hơn 0
Next i
' mảng mangHieu là map của các phần tử hiệu. Cái nào khong nhỏ hơn 0 là nằm trong tập hợp hiệu
' dồn nó lại nếu cần
j = NHONHAT - 1 ' j là số phần tử của tập hợp mới
For i = NHONHAT To TONHAT
If mangHieu(i) >= 0 Then
j = j + 1
mangHieu(j) = i
End If
Next i
If j >= NHONHAT Then ' mangHieu có phần tử
Redim Preserve mangHieu(NHONHAT to j)
Else ' mangHieu trống
Erase mangHieu
End If
 
Upvote 0
mảng điều kiện có 1 tính chất tăng dần , mình thử lợi dụng tính chất đó !
Mã:
Option Explicit

Sub aa()
    Dim mang
    
    mang = Array(0, 2, 5, 6, 8, 22, 34, 39, 999)
    
    Dim i As Integer '---1->40
    Dim j As Integer '---xuat du lieu
    Dim n As Integer '---vi tri cua mang
    
    n = 1
    j = 1
    
    For i = 1 To 40
        If i = mang(n) Then
           n = n + 1
        Else
           Cells(j, 1) = i
           j = j + 1
        End If
    Next i
    
End Sub
 
Upvote 0
mảng điều kiện có 1 tính chất tăng dần , mình thử lợi dụng tính chất đó !
Mã:
Option Explicit

Sub aa()
    Dim mang
   
    mang = Array(0, 2, 5, 6, 8, 22, 34, 39, 999)
   
    Dim i As Integer '---1->40
    Dim j As Integer '---xuat du lieu
    Dim n As Integer '---vi tri cua mang
   
    n = 1
    j = 1
   
    For i = 1 To 40
        If i = mang(n) Then
           n = n + 1
        Else
           Cells(j, 1) = i
           j = j + 1
        End If
    Next i
   
End Sub
Thuật toán so sánh 2 mảng song song thường đi kèm theo thuật toán đi đường tắt khi một mảng hết trước mảng kia.
 
Upvote 0
mảng điều kiện có 1 tính chất tăng dần , mình thử lợi dụng tính chất đó !
Mã:
Option Explicit

Sub aa()
    Dim mang
 
    mang = Array(0, 2, 5, 6, 8, 22, 34, 39, 999)
 
    Dim i As Integer '---1->40
    Dim j As Integer '---xuat du lieu
    Dim n As Integer '---vi tri cua mang
 
    n = 1
    j = 1
 
    For i = 1 To 40
        If i = mang(n) Then
           n = n + 1
        Else
           Cells(j, 1) = i
           j = j + 1
        End If
    Next i
 
End Sub
Viết gọn lại
PHP:
Sub test()
  Dim Mang, i&, n&
  Mang = Array(2, 5, 6, 8, 22, 34, 39)
  For i = 1 To 40
    If i = Mang(IIf(n > UBound(Mang), 0, n)) Then
       n = n + 1
    Else
       Cells(i - n, 1) = i
    End If
  Next i
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Xin các anh chị giúp đỡ

Em có 1 mảng đã được xác định là tập hợp của các số đã xác định nhỏ hơn 40

Ví dụ (2,5,6,8,22,34,39)

Làm thế nào để tạo được 1 mảng gồm các số còn lại từ 1 đến 40 (không bao gồm các số của mảng thứ nhất)

Em xin chân thành cảm ơn
Mảng không theo thứ tự
Mã:
Sub InverArray()
  Dim Arr, Res(), tmp As String, i As Long, k As Long
  Const iMin As Long = 1
  Const iMax As Long = 40
  Arr = Array(2, 5, 6, 8, 22, 34, 39)
  ReDim Res(1 To iMax - iMin - UBound(Arr))
  tmp = "," & Join(Arr, ",") & ","
  For i = iMin To iMax
    If InStr(1, tmp, "," & i & ",") = 0 Then
      k = k + 1
      Res(k) = i
    End If
  Next i
End Sub
Mảng có giá trị theo thứ tự từ nhỏ tới lớn
Mã:
Sub InverArrayShort()
  Dim Arr, Res(), i As Long, k As Long
  Const iMin As Long = 1
  Const iMax As Long = 40
  Arr = Array(2, 5, 6, 8, 22, 34, 39)
  ReDim Res(1 To iMax - iMin - UBound(Arr))
  ReDim Preserve Arr(0 To UBound(Arr) + 1)
  For i = iMin To iMax
    If i = Arr(k) Then k = k + 1 Else Res(i - k) = i
  Next i
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mảng không theo thứ tự
Mã:
Sub InverArray()
  Dim Arr, Res(), tmp As String, i As Long, k As Long
  Const iMin As Long = 1
  Const iMax As Long = 40
  Arr = Array(2, 5, 6, 8, 22, 34, 39)
  ReDim Res(1 To iMax - iMin - UBound(Arr))
  For i = 0 To UBound(Arr)
    tmp = tmp & "," & Arr(i)
  Next i
  tmp = tmp & ","
  For i = iMin To iMax
    If InStr(1, tmp, "," & i & ",") = 0 Then
      k = k + 1
      Res(k) = i
    End If
  Next i
End Sub
Hình như chỗ này:
Mã:
 For i = 0 To UBound(Arr)
            tmp = tmp & "," & Arr(i)
  Next i
           tmp = tmp & ","
thay bằng
Mã:
tmp = "," & Join(Arr, ",") & ","
cũng được hay sao í.
Thân
 
Upvote 0
Cám ơn bạn, đã chỉnh lại 2 code. Chúc bạn vui cả ngày /-*+//-*+//-*+/
 
Upvote 0
Web KT

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

Back
Top Bottom