Tìm chữ số khi cho vị trí của nó trong dãy (7 người xem)

  • Thread starter Thread starter nnd1988
  • Ngày gửi Ngày gửi
Liên hệ QC

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

nnd1988

Thành viên chính thức
Tham gia
10/3/14
Bài viết
68
Được thích
15
Nghề nghiệp
Nhân viên Văn Phòng
cho dãy vô hạn các số tự nhiên liên tiếp tăng dần 123456789101112131415....
Yêu cầu: Khi nhập vào vị trí thứ n sẽ hiện thông báo kết quả là chữ số tương ứng với vị trí đó.
Ví dụ: Khi nhập n=3 thì thông báo kết quả là "Chu so 3"
+ Khi nhap n=12 thì thông báo kết quả là chữ số 1
+Khi nhap n=15 thì thông báo kết quả là chữ số 2
P/S: n là số trong khoảng từ 1 đến 10000
 

File đính kèm

Lần chỉnh sửa cuối:
cho dãy vô hạn các số tự nhiên liên tiếp tăng dần 123456789101112131415....
Yêu cầu: Khi nhập vào vị trí thứ n sẽ hiện thông báo kết quả là chữ số tương ứng với vị trí đó.
Ví dụ: Khi nhập n=3 thì thông báo kết quả là "Chu so 3"
+ Khi nhap n=12 thì thông báo kết quả là chữ số 1
+Khi nhap n=5 thì thông báo kết quả là chữ số 2
P/S: n là số trong khoảng từ 1 đến 10000

Đoạn bôi xanh sai phải không bạn, nếu đúng phải là n=15 thì kết quả mới là 2 được chứ.
 
Upvote 0
cho dãy vô hạn các số tự nhiên liên tiếp tăng dần 123456789101112131415....
Yêu cầu: Khi nhập vào vị trí thứ n sẽ hiện thông báo kết quả là chữ số tương ứng với vị trí đó.
Ví dụ: Khi nhập n=3 thì thông báo kết quả là "Chu so 3"
+ Khi nhap n=12 thì thông báo kết quả là chữ số 1
+Khi nhap n=15 thì thông báo kết quả là chữ số 2
P/S: n là số trong khoảng từ 1 đến 10000
Hỏi lại bạn để làm cho đúng nè. Dãy số của bạn nằm mỗi số 1 cột hay là nguyên dãy đó nằm trong 1 ô???
 
Upvote 0
cho dãy vô hạn các số tự nhiên liên tiếp tăng dần 123456789101112131415....
Yêu cầu: Khi nhập vào vị trí thứ n sẽ hiện thông báo kết quả là chữ số tương ứng với vị trí đó.
Ví dụ: Khi nhập n=3 thì thông báo kết quả là "Chu so 3"
+ Khi nhap n=12 thì thông báo kết quả là chữ số 1
+Khi nhap n=15 thì thông báo kết quả là chữ số 2
P/S: n là số trong khoảng từ 1 đến 10000
Bạn xem File đính kèm nhé:
 

File đính kèm

Upvote 0
Upvote 0
Cảm ơn bạn, kết quả đúng rồi nhưng bài này mình muốn hỏi thuật toán của bài này cơ. Mình đăng bài này trong box "Lập trình với excel" mà bạn! Mong các bạn giúp mình thuật toán để giải bài này với!
À ừ nhỉ không để ý là bài này nằm trong box LẬP TRÌNH VỚI EXCEL. Ý bạn là dùng VBA ? Vậy thì phải chờ thành viên khác thôi, mình mới học nên chưa thể giúp bạn bài này được. Nhờ bác Giangleloi kia kìa @#!^%@#!^%@#!^%@#!^%
 
Upvote 0
Cảm ơn bạn, kết quả đúng rồi nhưng bài này mình muốn hỏi thuật toán của bài này cơ. Mình đăng bài này trong box "Lập trình với excel" mà bạn! Mong các bạn giúp mình thuật toán để giải bài này với!

bạn chỉ việc dùng hàm ofset đi thôi
Mã:
[a1].Offset(, so-1).Value
với "so" là con so bạn nhập vào
 
Upvote 0
À ừ nhỉ không để ý là bài này nằm trong box LẬP TRÌNH VỚI EXCEL. Ý bạn là dùng VBA ? Vậy thì phải chờ thành viên khác thôi, mình mới học nên chưa thể giúp bạn bài này được. Nhờ bác Giangleloi kia kìa @#!^%@#!^%@#!^%@#!^%
đúng . tôi thích đoạn màu đỏ . nhờ sát thủ Giangleloi là chắc ăn
 
Upvote 0
đúng . tôi thích đoạn màu đỏ . nhờ sát thủ Giangleloi là chắc ăn
trong lúc chờ cao thủ, thôi thì thấp thủ như mình làm tạm vậy, nghỉ sao làm vậy, chỉ có ý tưởng thôi
Mã:
Function Tim(rng As Range, so As Long)
    Tim = rng(1, so).Value
End Function
 

File đính kèm

Upvote 0
trong lúc chờ cao thủ, thôi thì thấp thủ như mình làm tạm vậy, nghỉ sao làm vậy, chỉ có ý tưởng thôi
Mã:
Function Tim(rng As Range, so As Long)
    Tim = rng(1, so).Value
End Function

em nghĩ là anh xui rồi bác ba phi ơi . ý người ta là tìm ở hàng số 2 . tìm ở hàng số 1 thì còn gì để bàn nữa ?
người ta muốn tạo hàm hamA () áp dụng trên hàng số 2
truyền vào số 15 trả về 2 . (hàng đơn vị của số 12 trong ô L2)
 
Upvote 0
Cảm ơn bạn, kết quả đúng rồi nhưng bài này mình muốn hỏi thuật toán của bài này cơ. Mình đăng bài này trong box "Lập trình với excel" mà bạn! Mong các bạn giúp mình thuật toán để giải bài này với!
Thuật toán:
Số số tự nhiên có n chữ số là 9*10^(n-1):
- 1 chữ số: 9*10^(1-1) = 9 (từ 1 đến 9)
- 2 chữ số: 9*10^(2-1) = 90 (từ 10 đến 99)
- 3 chữ số: 9*10^(3-1) = 900 (từ 100 đến 999)
- ...
=> Số chữ số của tất cả các số tự nhiên có n chữ số là 9*10^(n-1)*n
Từ đây ta có thể xác định được n khi biết vị trí chữ số cần tìm (x)
9*10^((n-1)-1)*(n-1) < x <= 9*10^(n-1)*n
Xác định được x là chữ số thứ mấy trong chuỗi các chữ số có n chữ số (x1)
x1 = x - 9*10^((n-1)-1)*(n-1)
Xác định được x nằm trong số tự nhiên nào bằng cách lấy phần nguyên phép chia x1/n
Xác định được x là số thứ mấy trong số tự nhiên đã tìm được bằng cách lấy phần dư phép chia x1/n

Thuật toán giải thích thì hơi rườm rà khó hiểu. Đây là code, có khi các bạn đọc code sẽ dễ hiểu hơn.
PHP:
Function TimSo(ViTri As Long) As String
Dim i As Long, Tong As Long, Du As Long
Do Until ViTri <= Tong
    i = i + 1
    Tong = Tong + 9 * 10 ^ (i - 1) * i
Loop
Du = ViTri - (Tong - 9 * 10 ^ (i - 1) * i)
TimSo = Mid(10 ^ (i - 1) + Int(Du / i - 10 ^ -3), (Du - 1) Mod i + 1, 1)
End Function
 
Upvote 0
Chắc là vầy chăng:
Mã:
Function MidSpec(ByVal Position As Long) As Long
  Dim n As Long, lenght As Long
  Dim tmp As String
  Do
    n = n + 1
    tmp = tmp & n
    lenght = Len(tmp)
  Loop Until lenght >= Position
  MidSpec = Mid(tmp, Position, 1)
End Function
Cảm giác có phép tính nào đó "độc chiêu" mà không cần đến vòng lập (nhưng chưa nghĩ ra)
 
Upvote 0
...
Cảm giác có phép tính nào đó "độc chiêu" mà không cần đến vòng lập (nhưng chưa nghĩ ra)

Bạn tưởng tượng có nhiều dãy số:
Dãy thứ nhất từ 0 đến 9 -> 10 số, dài 10
Dãy thứ hai từ 10 đến 99 -> 90 số, dài 180
Dãy thứ ba từ 100 dến 999 -> 900 số, dài 2700

Nếu dùng phép tính thoái trị sẽ tìm được công thức xác định trực iếp một số nằm đúng chỗ nào. Bài #16 đã đi gần đến chỗ này, nhưng thay vì quy ra công thức thì lại lập chuỗi nên phải dùng vòng lặp.

Nếu là tôi thì dựa vào điều kiện của bài, n <= 1000. Tôi chỉ việc dùng vài cái IF's
IF n <= 10 quy trong vùng 1
Else if n <= 190 quy trong vùng 2 ### 190 = 180 + 10
Else quy trong vùng 3
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn tưởng tượng có nhiều dãy số:
Dãy thứ nhất từ 0 đến 9 -> 10 số, dài 10
Dãy thứ hai từ 10 đến 99 -> 90 số, dài 180
Dãy thứ ba từ 100 dến 999 -> 900 số, dài 2700

Nếu dùng phép tính thoái trị sẽ tìm được công thức xác định trực iếp một số nằm đúng chỗ nào. Bài #16 đã đi gần đến chỗ này, nhưng thay vì quy ra công thức thì lại lập chuỗi nên phải dùng vòng lặp.

Nếu là tôi thì dựa vào điều kiện của bài, n <= 1000. Tôi chỉ việc dùng vài cái IF's
IF n <= 10 quy trong vùng 1
Else if n <= 190 quy trong vùng 2 ### 190 = 180 + 10
Else quy trong vùng 3

đáp theo ý tưởng . đồng thời bài #1 nói rằng dãy bắt đầu từ số 1 . hihi

Mã:
Function helloSo(ViTri As Long) As String
Dim tempI As Long
If ViTri < 10 Then
helloSo = ViTri
ElseIf ViTri < 190 Then
helloSo = Mid(9 + WorksheetFunction.RoundUp((ViTri - 9) / 2, 0), 2 - ((ViTri - 9) Mod 2), 1)
ElseIf ViTri < 2890 Then
helloSo = Mid(99 + WorksheetFunction.RoundUp((ViTri - 189) / 3, 0), IIf((ViTri - 189) Mod 3 = 0, 3, (ViTri - 189) Mod 3), 1)
Else
helloSo = "gi vay cha noi"
End If
End Function
 
Upvote 0
Web KT

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

Back
Top Bottom