Tìm phần tử thứ N trong dãy số bằng VBA

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

kan

Thành viên mới
Tham gia
26/1/08
Bài viết
47
Được thích
6
Nhờ anh chị giúp đoạn code để tìm:
Dãy số có quy luật như sau: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5,…
Nhập vào một số tự nhiên , tìm số thứ của dãy số trên (các số được đánh thứ tự từ 1).
( 0< N<10^10)
Ví dụ: N=9 thì số thứ N là 4.
Cảm ơn anh, chị !
 
Dãy số có quy luật như vậy được gọi là dãy số Tam giác.
Giá trị của số hạng thứ n trong dãy Tam giác có thể được tính bằng cách sử dụng công thức:

Ví dụ ô A1 ta nhập 9; Công thức tại ô B1 là = CEILING(SQRT(2*A1-0.25)-0.5,1)
1686312837245.png
Kết quả thu về là 4.

Nếu dùng mã VBA thì tham khảo
PHP:
Function Ceiling(number As Double) As Double
    Ceiling = -Int(-number)
End Function

Function GetValueAtIndex(index As Integer) As Integer
    GetValueAtIndex = Ceiling(Sqr(2 * index - 0.25) - 0.5)
End Function

Sub Test()
Debug.Print GetValueAtIndex(9)
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Dãy số có quy luật như vậy được gọi là dãy số Tam giác.
Giá trị của số hạng thứ n trong dãy Tam giác có thể được tính bằng cách sử dụng công thức:

Ví dụ ô A1 ta nhập 9; Công thức tại ô B1 là = CEILING(SQRT(2*A1-0.25)-0.5,1)
View attachment 291257
Kết quả thu về là 4.

Nếu dùng mã VBA thì tham khảo
PHP:
Function Ceiling(number As Double) As Double
    Ceiling = -Int(-number)
End Function

Function GetValueAtIndex(index As Integer) As Integer
    GetValueAtIndex = Ceiling(Sqr(2 * index - 0.25) - 0.5)
End Function

Sub Test()
Debug.Print GetValueAtIndex(9)
End Sub
Cám ơn bạn đã giúp.
Có thể dùng cách khác mà không cần dùng cách giải nghiệm phương trình bậc 2 không ? vì cháu nó mới học tiểu học ạ (chưa học và giải phương trình bậc 2, cũng không học python).
 
Upvote 0
vì cháu nó mới học tiểu học ạ (chưa học và giải phương trình bậc 2, cũng không học python).
Ủa em có thắc mắc là cháu nó học tiểu học mà đã biết đến khái niệm 10^10 rồi à anh?
Trẻ con giờ học VBA sớm thế này mấy nữa siêu lắm đây!
 
Upvote 0
Nhờ anh chị giúp đoạn code để tìm:
Dãy số có quy luật như sau: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5,…
Nhập vào một số tự nhiên , tìm số thứ của dãy số trên (các số được đánh thứ tự từ 1).
( 0< N<10^10)
Ví dụ: N=9 thì số thứ N là 4.
Cảm ơn anh, chị !
Làm 2 cách, dùng tùy thích
Mã:
Function ReCSC(ByVal S)
  Dim tmp, t
  tmp = Sqr(2 * S - 0.25) - 0.5
  t = Int(tmp)
  If t < tmp Then ReCSC = t + 1 Else ReCSC = t
End Function

Function ReABC(ByVal S)
  Dim i, j, k
  For i = 1 To S
    k = k + i
    If k >= S Then
      ReABC = i
      Exit Function
    End If
  Next i
End Function
 
Upvote 0
Ủa em có thắc mắc là cháu nó học tiểu học mà đã biết đến khái niệm 10^10 rồi à anh?
Trẻ con giờ học VBA sớm thế này mấy nữa siêu lắm đây!
Không chỉ lũy thừa, mà cả cấp số cộng nữa.

Code VBA, đã lỡ chơi láng rồi thì đệ quy luôn cho Thầy/Cô lác mắt. (chỉ công trừ nhân chia thôi, không có lũy thừa căn số gì nhé):

Function HocGioi(ByVal N As Long, Optional ByVal Mo As Long = 0) As Long
If (Mo * Mo + Mo) \ 2 >= N Then
HocGioi = Mo
Else
HocGioi = HocGioi(N, Mo + 1)
End If
End Function
 
Upvote 0
Giờ chả biết lớp 5 đã học tới cái gì. Thôi thử cách này vậy, thay vì xếp ngang thì xếp dọc lại
Hàng 01: 1
Hàng 02: 2 2
Hàng 03: 3 3 3
..........
Hàng n : thì có N số n
(N là số lượng phần tử trong hàng)

Nghĩa là đếm hết tới hàng n sẽ có tổng (1 + 2 + 3 + ... +n) số.
Tổng n số tự nhiên liên tiếp là: (1+n)*n/2 công thức (*)
Lưu ý tổng này cũng sẽ chính là số thứ tự cuối cùng tính đến hàng n khi xếp theo phương ngang. Hay (*) là Stt = (1+n)*n/2 --> cách hiểu nha.
Vậy giả sử cần tìm số thứ tự là 9 thì lần lượt "thay đại" n = 3, 4, 5 trả ra Stt = 6,10,15
số 9 nằm giữa STT nằm 6 và 10; hay n thuộc hàng thứ 4;
Áp dụng chính là function của anh @VetMini đó

PHP:
Function HocGioi(ByVal N As Long, Optional ByVal Mo As Long = 0) As Long
If (Mo * Mo + Mo) \ 2 >= N Then
HocGioi = Mo
Else
HocGioi = HocGioi(N, Mo + 1)
End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Không chỉ lũy thừa, mà cả cấp số cộng nữa.

Code VBA, đã lỡ chơi láng rồi thì đệ quy luôn cho Thầy/Cô lác mắt. (chỉ công trừ nhân chia thôi, không có lũy thừa căn số gì nhé):

Function HocGioi(ByVal N As Long, Optional ByVal Mo As Long = 0) As Long
If (Mo * Mo + Mo) \ 2 >= N Then
HocGioi = Mo
Else
HocGioi = HocGioi(N, Mo + 1)
End If
End Function
Cấp số cộng chỉ cần phép tính cộng chưa cần tới toán tử nhân chia :p
 
Upvote 0
Cấp số cộng chỉ cần phép tính cộng chưa cần tới toán tử nhân chia :p
Tổng 5 số hạng = 1 + 2 + 3 +4 + 5
Tổng 10 số hạng = 1 + 2 +3 +4 +5 +6 +7 + 8+ 9 + 10
Tổng 100 số hạng chắc cũng vậy, từ từ sẽ ra thôi.
 
  • Thích
Reactions: kan
Upvote 0
Cấp số cộng chỉ cần phép tính cộng chưa cần tới toán tử nhân chia :p
Lười đặt thêm một tham nữa để chứa cấp số.

Function HocGioi(ByVal N As Long, Optional ByVal Tong As Long = 0, Optional ByVal Mo As Long = 0) As Long
If Tong + Mo >= N Then
HocGioi = Mo
Else
HocGioi = HocGioi(N, Tong + Mo, Mo + 1)
End If
End Function

1686329693095.png
 
Upvote 0
Căm ơn các Anh/ Chị / Em đã nhiệt tình giúp đỡ! Đặc biệt là @huhumalu @HieuCD @VetMini đã viết code cụ thể để xử lý.
Mình xin phản hồi một số thông tin và kết quả test ạ:
1. Về điều kiện: ( 0< N<10^10) là nhằm hạn chế thời gian tính toán (để chấm điểm tốc độ tính toán) (thực tế yêu cầu là 10^18).
2. Kết quả test:
- Code 01:
PHP:
Function Ceiling(number As Double) As Double
Ceiling = -Int(-number)
End Function

Function GetValueAtIndex(index As Integer) As Integer
GetValueAtIndex = Ceiling(Sqr(2 * index - 0.25) - 0.5)
End Function

Sub Test()
Debug.Print GetValueAtIndex(9)
End Sub
Test code này với index = 10^9 (tức là index = 10.000.000.000) thì hàm cho kết quả là #NUM!

- Code 02:
Function HocGioi(ByVal N As Long, Optional ByVal Tong As Long = 0, Optional ByVal Mo As Long = 0) As Long
If Tong + Mo >= N Then
HocGioi = Mo
Else
HocGioi = HocGioi(N, Tong + Mo, Mo + 1)
End If
End Function
Test code này với N > 3.500.000 thi hàm cho kết quả là #VALUE!

- Code 03:
Function ReABC(ByVal S)
Dim i, j, k
For i = 1 To S
k = k + i
If k >= S Then
ReABC = i
Exit Function
End If
Next i
End Function
Test code này với S = 10^15 (tức là S=10.000.000.000.000.000) thi hàm cho kết quả tốt nhưng tốc độ xử lý hơi chậm (khoảng gần 01 phút). Theo yêu cầu của đề bài thì sẽ không được điểm.

- Code 04:
Function ReCSC(ByVal S)
Dim tmp, t
tmp = Sqr(2 * S - 0.25) - 0.5
t = Int(tmp)
If t < tmp Then ReCSC = t + 1 Else ReCSC = t
End Function
Test code này với S = 10^15 (tức là S=10.000.000.000.000.000) thi hàm cho kết quả tốt nhưng tốc độ xử lý nhanh, đáp ứng được yêu cầu của đề bài.
Qua kết quả test ở trên thì có lẽ cách giải bài này theo hướng giải nghiệm phương trình bậc 2 mới đáp ứng được kết quả và yêu cầu về thời gian tính toán.
Tiểu học mà ra bài này thì chắc dính cả buồng chuối rồi.
 
Upvote 0
Đề này là đề ôn luyện học sinh giỏi Khu vực của các cháu đấy ạ, có thể sử dụng Python mà cháu nó không học ngôn ngữ này.
Lớp 5 với đề học sinh giỏi cỡ này, rồi code vba, python...
hỏng lẽ giáo dục của ta đang đào tạo một thế hệ làm chủ cả giải ngân hà chăng?
 
Upvote 0
Đề này là đề ôn luyện học sinh giỏi Khu vực của các cháu đấy ạ, có thể sử dụng Python mà cháu nó không học ngôn ngữ này.
Vậy khuyến khích cháu nó học python thay vì vba luôn đi, python giờ phổ biến và có tương lai hơn. Còn bài này muốn code python thì bê cái code vba vào chatGPT kêu nó chuyển sang python là xong :D
 
Upvote 0
Em hiểu là bài tập này để các con rèn luyện tư duy lập trình.
Một dãy số được tạo ra từ dãy số tự nhiên ban đầu bắt đầu từ 1, trong đó dãy số mới có n số tự nhiên N.
Hỏi số thứ M trong dãy số được tạo ra là số bao nhiêu?
Gửi phụ huynh tham khảo.

C:
Function TimSoThuN(n As Double)
    Dim I As Double
    Dim SoTuNhien As Double
    SoTuNhien = 1
    
    Do While True
        I = I + SoTuNhien
        If I >= n Then
            TimSoThuN = SoTuNhien
            Exit Function
        End If
        SoTuNhien = SoTuNhien + 1
    Loop
    
End Function

Sub Test()
    Dim t As Double
    Dim n As Double
    Dim I As Long
    
    For I = 1 To 18
        t = Timer
        n = Application.Power(10, I)
        Debug.Print "N=10^" & I & ": " & TimSoThuN(n) & " >>> " & Timer - t
    Next I
End Sub

Kết quả của em thế này (post nguyên từ cửa số :
N=10^1: 4 >>> 0
N=10^2: 14 >>> 0
N=10^3: 45 >>> 0
N=10^4: 141 >>> 0
N=10^5: 447 >>> 0
N=10^6: 1414 >>> 0
N=10^7: 4472 >>> 0
N=10^8: 14142 >>> 0
N=10^9: 44721 >>> 0
N=10^10: 141421 >>> 0.0078125
N=10^11: 447214 >>> 0.01953125
N=10^12: 1414214 >>> 0.0625
N=10^13: 4472136 >>> 0.2265625
N=10^14: 14142136 >>> 0.59765625
N=10^15: 44721360 >>> 1.80859375
N=10^16: 141421356 >>> 5.87890625
N=10^17: 447213596 >>> 18.26171875
N=10^18: 1414213563 >>> 55.8828125
 
Upvote 0
/(hông biết nói gì hơn: GIÁO DỤC VIE THẬT KINH KHỦNG!
 
Upvote 0
Web KT
Back
Top Bottom