Tìm tập D (trong khoảng giới hạn) mà chia hết cho số A

Liên hệ QC

LEHOC

Thành viên chính thức
Tham gia
11/1/17
Bài viết
89
Được thích
0
Em chào các thành viên trong diễn đàn.
Em có 1 bài toán như sau mong muốn a/c cho em giải pháp ạ:
Nhập vào các số A, B, C.
Tìm tập D={d1, d2, ..., dn} sao cho:
1) các phần tử trong D đều chia hết A
2) d(n) <= B
3) C là giới hạn làm tròn nếu:
1. C thuộc tập từ 0,1 đến 0,9 thì lấy giá trị D có 1 số thập phân hoặc D là số nguyên.
2. C thuộc tập từ 0,11 đến 0,99 thì lấy giá trị D có 2 số thập phân hoặc D là số nguyên.
Ví dụ 1: A=0.05; B=20; C = 0.5 => D={0, 0.5, 1, ..., 20}
Ví dụ 1: A=0.05; B=20; C = 0.25 => D={0, 0.25, 0.5, ..., 20}
Ví dụ 2: A=0.09; B=91; C= 0.5 => D={0, 4.5, 9, 13.5, ..., 90}
Ví dụ 3: A= 0.1; B=105; C = 5 => D={0, 5, 10, 15, ..., 105}

Ý tưởng giải quyết vấn đề:
PHP:
Sub Button1_Click()
    Dim a, b, c, i, j
    Dim AcSh1 As Worksheet
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    i = 0: j = 0
    a = InputBox("Nhap boi so")
    b = InputBox("Nhap gioi han tich cua boi so a")
    c = InputBox("Nhap gioi han tich lam tron ket qua")
    Set AcSh1 = ActiveSheet
    If AcSh1.Cells(4, "A").End(xlDown).Row = AcSh1.Rows.Count Or AcSh1.Cells(5, "A").End(xlDown).Row = AcSh1.Rows.Count Then
        AcSh1.Range("A4:B" & AcSh1.Rows.Count).Clear
    ElseIf AcSh1.Cells(AcSh1.Rows.Count, "A").End(xlUp).Row Then
        AcSh1.Range("A4:B" & AcSh1.Cells(AcSh1.Rows.Count, "A").End(xlUp).Row).Clear
    End If
    AcSh1.Cells(4, "A") = a
    AcSh1.Cells(4, "B") = b
    AcSh1.Cells(4, "C") = c
   
    Do While (c * i) <= b
        If (c * i) Mod a = 0 Then
            AcSh1.Cells(5 + j, "A") = c * i
            j = j + 1
        End If
        i = i + 1
    Loop
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

Rất mong được anh chị sửa lỗi trong code và cho em biết liệu giải pháp này đã tối ưu nhất chưa ạ, nếu chưa, xin cho em một giải pháp khác.

Em cảm ơn!
 
Lần chỉnh sửa cuối:
Theo định luật toán số, khái niệm "chia hết" chỉ được định nghĩa cho số nguyên.
Số thực, nếu muốn ép phép toán "chia hết" thì phải quy chúng về số nguyên.
ví dụ:
a = 123,456; b = 78.99
thì phải quy thành 123456E-3 và 78990E-3 (cùng bậc luỹ thừa E). Sau đó mới xét nếu 123456 chia hết 78990.

Điều đáng ghi nhớ là trong máy tính, số thập phân có thể được máy chứa sai số một chút. Muốn so sánh kết quả biểu thức thì phải xác định sai số cho phép.
 
Upvote 0
Theo định luật toán số, khái niệm "chia hết" chỉ được định nghĩa cho số nguyên.
Số thực, nếu muốn ép phép toán "chia hết" thì phải quy chúng về số nguyên.
ví dụ:
a = 123,456; b = 78.99
thì phải quy thành 123456E-3 và 78990E-3 (cùng bậc luỹ thừa E). Sau đó mới xét nếu 123456 chia hết 78990.

Điều đáng ghi nhớ là trong máy tính, số thập phân có thể được máy chứa sai số một chút. Muốn so sánh kết quả biểu thức thì phải xác định sai số cho phép.
Bác cho em hỏi sao phép toán logic sau lại không đúng vậy:
(a * i) - Int(a * i)=c
Với: a=0.09;
i=95;
c=0.55
Trong VBA: Vế bên trái = 0.5499999999<>0.55 => False
Dùng máy tính cầm tay thì 2 vế bằng nhau.
Mong bác cho em biết nguyên nhân và cách khắc phục ạ.
Em cảm ơn!
 
Upvote 0
Em chào các thành viên trong diễn đàn.
Em có 1 bài toán như sau mong muốn a/c cho em giải pháp ạ:
Nhập vào các số A, B, C.
Tìm tập D={d1, d2, ..., dn} sao cho:
1) các phần tử trong D đều chia hết A
2) d(n) <= B
3) C là giới hạn làm tròn nếu:
1. C thuộc tập từ 0,1 đến 0,9 thì lấy giá trị D có 1 số thập phân hoặc D là số nguyên.
2. C thuộc tập từ 0,11 đến 0,99 thì lấy giá trị D có 2 số thập phân hoặc D là số nguyên.
Ví dụ 1: A=0.05; B=20; C = 0.5 => D={0, 0.5, 1, ..., 20}
Ví dụ 1: A=0.05; B=20; C = 0.25 => D={0, 0.25, 0.5, ..., 20}
Ví dụ 2: A=0.09; B=91; C= 0.5 => D={0, 4.5, 9, 13.5, ..., 90}
Ví dụ 3: A= 0.1; B=105; C = 5 => D={0, 5, 10, 15, ..., 105}

Ý tưởng giải quyết vấn đề:
PHP:
Sub Button1_Click()
    Dim a, b, c, i, j
    Dim AcSh1 As Worksheet
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    i = 0: j = 0
    a = InputBox("Nhap boi so")
    b = InputBox("Nhap gioi han tich cua boi so a")
    c = InputBox("Nhap gioi han tich lam tron ket qua")
    Set AcSh1 = ActiveSheet
    If AcSh1.Cells(4, "A").End(xlDown).Row = AcSh1.Rows.Count Or AcSh1.Cells(5, "A").End(xlDown).Row = AcSh1.Rows.Count Then
        AcSh1.Range("A4:B" & AcSh1.Rows.Count).Clear
    ElseIf AcSh1.Cells(AcSh1.Rows.Count, "A").End(xlUp).Row Then
        AcSh1.Range("A4:B" & AcSh1.Cells(AcSh1.Rows.Count, "A").End(xlUp).Row).Clear
    End If
    AcSh1.Cells(4, "A") = a
    AcSh1.Cells(4, "B") = b
    AcSh1.Cells(4, "C") = c
  
    Do While (c * i) <= b
        If (c * i) Mod a = 0 Then
            AcSh1.Cells(5 + j, "A") = c * i
            j = j + 1
        End If
        i = i + 1
    Loop
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

Rất mong được anh chị sửa lỗi trong code và cho em biết liệu giải pháp này đã tối ưu nhất chưa ạ, nếu chưa, xin cho em một giải pháp khác.

Em cảm ơn!
Nhập các giá trị a, b, c vào các ô B2, C2, D2
Mã:
Sub Button1_Click()
  Dim a#, b#, c#, i&, j&, N#, tmp#
  Const e As Double = 10 ^ (-14)
 
  Application.ScreenUpdating = False
  a = Range("B2").Value
  b = Range("C2").Value
  c = Range("D2").Value
  i = Range("A" & Rows.Count).End(xlUp).Row
  If i > 1 Then Range("A2:A" & i).Clear
  If a <= 0 Then Exit Sub
  i = 1
  Do While N <= b
    tmp = N - Int(N)
    If Abs(tmp - c) < e Or tmp < e Then
      i = i + 1
      Cells(i, "A") = N
    End If
    j = j + 1
    N = (a * j)
  Loop
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
...Trong VBA: Vế bên trái = 0.5499999999<>0.55 => False
Dùng máy tính cầm tay thì 2 vế bằng nhau.
Bạn nói chỉ có bạn hiểu. Gặp toán thì phải diễn giải cho rõ.

...Điều đáng ghi nhớ là trong máy tính, số thập phân có thể được máy chứa sai số một chút. Muốn so sánh kết quả biểu thức thì phải xác định sai số cho phép.
 
Upvote 0
Lô gic: nếu D chia hết cho A thì có nghĩa là D = A*n ; n=1,2,3,....

For i = A To B Step A
Di = i
Next i

Lô gic cho số lẻ: nếu D chia cho A ra 1 số lẻ thập phân thì
D/A = x.y
10*D/A = xy
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom