Biểu diễn bài toán cổ đại ra Excel bởi VBA

Liên hệ QC

HeSanbi

Nam Nhân✨Hiếu Lễ Nghĩa Trí Tín✨
Tham gia
24/2/13
Bài viết
2,386
Được thích
3,576
Giới tính
Nam
Tôi thấy trong giai thoại toán học có bài toán, chưa có lời giải
nay muốn GPE giúp đỡ biễu diễn ra Excel
Để mọi người trên GPE cùng nhau giải bài toán
Bài toán thế này:
Có vòng tròn chạy từ 1 đến số cho trước (giống đồng hồ), Ta phải loại bỏ số để tìm ra được số cuối cùng , phương pháp loại : cách một số bỏ đi một số bắt đầu từ số 1 theo vòng tròn liên tục
Luật chơi của bài toán: chỉ được tính nhẩm
Ví dụ:
Có 12 số từ 1 đến 12, Cách 1 bỏ 2, cách 3 bỏ 4,các số còn lại 1,3,5,7,9,11 , tiếp tục loại đi theo vòng tròn
,11 đã bỏ 12, tiếp tục 1 bỏ 3, 5 bỏ 7, 9 bỏ 11, các số còn lại ở vòng loại này là 1,5,9, vì 9 đã bỏ 11 (số cuối của vòng loại này, nên 1 bỏ 5 và 9 bỏ 1, vậy 9 là số còn lại.

Với 13 số 1 đến 13, khi loại còn lại 1,3,5,7,9,11, đến 13 sẽ bỏ 1
Vòng tròn đầu
1 2 3 4 5 6 7 8 9 10 11 12 13
Lặp nên 1 vòng mới sau khi đã loại
1 3 5 7 9 11 13 vì 13 là cuối vòng nên quay về loại số 1 để tiếp tục
13 bỏ 1, 3 bỏ 5, 7 bỏ 9, 11 bỏ 13
Có vòng mới còn 3 số
3 7 11
Tiếp tục sẽ là 3 bỏ 7, và 11 loại 3, số cuối cùng là 11
Nếu theo vòng tròn sẽ như thế này:
1 2 3 4 5 6 7 8 9 10 11 12/ 1 3 5 7 9 11/1 5 9/1 9/9
1 2 3 4 5 6 7 8 9 10 11 12 13 / 1 3 5 7 9 11 13 /3 7 11/ 3 11/11
(Ví dụ nằm ở Sheet VongTron)
Mong GPE giúp tạo một code để biễu diễn bài toán trên, khi thay đổi số cho trước thì code thực hiện.
Xin chân thành cảm ơn! (tôi có File bên dưới)
Một số kết quả để so sánh:
Với 500000 số cho kết quả là 474513
Với 56789 số là 48043
Với 656434 số là 264293
 

File đính kèm

  • LoaiVongTron.xlsm
    25.4 KB · Đọc: 18
Lần chỉnh sửa cuối:
Mình sửa tiêu đề bài viết cho rõ ràng hơn nhé. Kiểu giật tít thì thường chờ hơi lâu!
 
Upvote 0
.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi thấy trong giai thoại toán học có bài toán, chưa có lời giải
nay muốn GPE giúp đỡ biễu diễn ra Excel
Để mọi người trên GPE cùng nhau giải bài toán
Bài toán thế này:
Có vòng tròn chạy từ 1 đến số cho trước (giống đồng hồ), cách một số bỏ đi một số bắt đầu từ số 1,
loại bỏ cho đến khi còn lại một số cuối cùng.
Với 12 số như cái đồng hồ thì suy nghĩ vui cũng ra, nhưng 1 triệu tới 10 triệu thì có máy tính mới giải được.
(lời giải bài toán phải là một công thức rút gọn có cơ sở)
Mong GPE giúp tạo một code để biễu diễn bài toán trên, khi thay đổi số cho trước thì code thực hiện.
Xin chân thành cảm ơn! (tôi có File bên dưới)
Một số kết quả:
500000 là 474513
56789 là 48043
656434 là 264293
Người này mình thấy quen, hình như đã từng dạo bước trong KHTN thì phải ?
 
Upvote 0
Tôi thấy trong giai thoại toán học có bài toán, chưa có lời giải
nay muốn GPE giúp đỡ biễu diễn ra Excel
Để mọi người trên GPE cùng nhau giải bài toán
Bài toán thế này:
Có vòng tròn chạy từ 1 đến số cho trước (giống đồng hồ), cách một số bỏ đi một số bắt đầu từ số 1,
loại bỏ cho đến khi còn lại một số cuối cùng.
Với 12 số như cái đồng hồ thì suy nghĩ vui cũng ra, nhưng 1 triệu tới 10 triệu thì có máy tính mới giải được.
(lời giải bài toán phải là một công thức rút gọn có cơ sở)
Mong GPE giúp tạo một code để biễu diễn bài toán trên, khi thay đổi số cho trước thì code thực hiện.
Xin chân thành cảm ơn! (tôi có File bên dưới)
Một số kết quả:
500000 là 474513
56789 là 48043
656434 là 264293

Mình góp vui tý nhé :
PHP:
Option Explicit
Option Base 1

Private Function LoaiSo(ByRef arrDaySo() As Long, isLoaiSoCuoi As Boolean) As Variant
    If UBound(arrDaySo) > 1 Then
        Dim i As Long, j As Long, SoDau As Long, SoCuoi As Long, arrDayMoi() As Long
        
        SoDau = IIf(isLoaiSoCuoi, 2, 1)
        SoCuoi = UBound(arrDaySo)
        ReDim arrDayMoi(SoCuoi)
        
        For i = SoDau To SoCuoi Step 2
            j = j + 1
            arrDayMoi(j) = arrDaySo(i)
        Next
        
        ReDim Preserve arrDayMoi(j)
        isLoaiSoCuoi = (arrDayMoi(j) = arrDaySo(SoCuoi))
        
        LoaiSo = LoaiSo(arrDayMoi(), isLoaiSoCuoi)
    Else
        LoaiSo = arrDaySo()
    End If
End Function
Public Function TimSoCuoi(ByRef SoCuoiCung As Long) As Long
    Dim i As Long, arrDaySo() As Long
    
    ReDim arrDaySo(SoCuoiCung)
    For i = 1 To SoCuoiCung
        arrDaySo(i) = i
    Next
        
    TimSoCuoi = LoaiSo(arrDaySo, False)(1)
End Function
 

File đính kèm

  • LoaiVongTron.xlsm
    39.1 KB · Đọc: 19
Upvote 0
Chẳng hạn: "Tìm số cuối cùng của dãy số sau khi loại vòng tròn."

Đây là bài toán "bắn tù binh". Đem n người bắt xếp vòng tròn, cứ chọn cách 1 người thì đem ra bắn. Bây giờ bạn chọn trí đứng thế nào để còn là người cuối cùng - khỏi bị bắn.
Bài này viết code thì dễ ợt thôi. Có gì đâu.
Chỉ tìm ra mẹo giải thuật độc đáo mới khó.
 
Upvote 0
Mình góp vui tý nhé :
PHP:
Option Explicit
Option Base 1

Private Function LoaiSo(ByRef arrDaySo() As Long, isLoaiSoCuoi As Boolean) As Variant
    If UBound(arrDaySo) > 1 Then
        Dim i As Long, j As Long, SoDau As Long, SoCuoi As Long, arrDayMoi() As Long
      
        SoDau = IIf(isLoaiSoCuoi, 2, 1)
        SoCuoi = UBound(arrDaySo)
        ReDim arrDayMoi(SoCuoi)
      
        For i = SoDau To SoCuoi Step 2
            j = j + 1
            arrDayMoi(j) = arrDaySo(i)
        Next
      
        ReDim Preserve arrDayMoi(j)
        isLoaiSoCuoi = (arrDayMoi(j) = arrDaySo(SoCuoi))
      
        LoaiSo = LoaiSo(arrDayMoi(), isLoaiSoCuoi)
    Else
        LoaiSo = arrDaySo()
    End If
End Function
Public Function TimSoCuoi(ByRef SoCuoiCung As Long) As Long
    Dim i As Long, arrDaySo() As Long
  
    ReDim arrDaySo(SoCuoiCung)
    For i = 1 To SoCuoiCung
        arrDaySo(i) = i
    Next
      
    TimSoCuoi = LoaiSo(arrDaySo, False)(1)
End Function
Cảm ơn anh thaipv, kết quả của anh rất đúng, nhưng kết quả thì tôi có thể tìm được, tôi muốn biểu diễn các số sau những vòng loại ra excel, không biết có được không
Lúc đầu tiêu đề là "Biễu diễn" nhưng anh befaint, kêu "giật tít ", đành sửa lại, code của anh có thể giải thích một chút đc ko, anh đã dùng pp loại như thế nào
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là bài toán "bắn tù binh". Đem n người bắt xếp vòng tròn, cứ chọn cách 1 người thì đem ra bắn. Bây giờ bạn chọn trí đứng thế nào để còn là người cuối cùng - khỏi bị bắn.
Bài này viết code thì dễ ợt thôi. Có gì đâu.
Chỉ tìm ra mẹo giải thuật độc đáo mới khó.
Chính xác đấy anh VetMini, em chỉ muốn biểu diễn ra để tìm GIải thuật
 
Upvote 0
Nhưng mà mục đich là gì vậy?
Bài toán này thuộc các bài toán cổ xưa chưa có lời giải, nằm trong Giai thoại toán học, thấy lạ nên mang lên Excel diễn giải thử, cũng để mọi người trên GPE hợp sức giải
Kết quả của bài toán là công thức rút gọn có cơ sở
 
Upvote 0
Chẳng hạn: "Tìm số cuối cùng của dãy số sau khi loại vòng tròn."
Em muốn biểu diễn các số ra qua từng vòng thì mọi người mới rõ được mới tìm được lời giải bài toán
Luật chơi của bài toán: chỉ được tính nhẩm
 
Upvote 0
Mâu thuẫn đến lẩn thẩn. Đã tính nhẩm thì VBA quái gì nữa.
Để tìm ra giải thuật đấy anh VieMini, công thức để tính nhẩm, và phải có cơ sở về công thức
Nếu không được biểu diễn rỏ thì làm sao có cơ sở để tạo ra một công thức cho một bài toán chưa có lời giải
Và công thức thì em có rồi ( đặc biệt , bí mật) ^^, và em chưa có cơ sở, nên mới phải biêu diễn ra
 
Upvote 0
Tưởng VBA thì còn có chút hứng thú. Mò công thức thì thôi, nhường các bạn khác.
Chúc bạn may mắn.
 
Upvote 0
Để tìm ra giải thuật đấy anh VieMini, công thức để tính nhẩm, và phải có cơ sở về công thức
Nếu không được biểu diễn rỏ thì làm sao có cơ sở để tạo ra một công thức cho một bài toán chưa có lời giải
Và công thức thì em có rồi ( đặc biệt , bí mật) ^^, và em chưa có cơ sở, nên mới phải biêu diễn ra

Nếu bạn tìm ra được công thức thì bạn đã biết cách biểu diễn (theo từ bạn nói) / biện luận cho công thức đó

Nhưng rất tiếc là bài toán này (bài toán giết người bên cạnh bằng kiếm theo vòng tròn--> tìm vị trí đứng là người cuối cùng còn sống ) người ta giải rồi, và đưa công thức ngắn gọn và video giải thích biện luận đầy đủ. Mọi người không phải nhọc công làm chi.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh thaipv, kết quả của anh rất đúng, nhưng kết quả thì tôi có thể tìm được, tôi muốn biểu diễn các số sau những vòng loại ra excel, không biết có được không
Lúc đầu tiêu đề là "Biễu diễn" nhưng anh befaint, kêu "giật tít ", đành sửa lại, code của anh có thể giải thích một chút đc ko, anh đã dùng pp loại như thế nào
Xin giải thích code tôi như sau :
0. Xác định mảng cần tìm số cuối cùng theo cách loại vòng tròn.
1. Bỏ đi các số ở vị trí chẵn cho đến số cuối cùng trong mảng.
1.1 Nếu mảng còn 1 phần tử (số cần tìm) > Kết thúc giải thuật.
1.2 Nếu số cuối cùng trong mảng đã bị loại > Làm lại bước 1.
1.3 Nếu số cuối cùng trong mảng chưa bị loại > Chuyển qua bước 2.
2. Bỏ đi các số ở vị trí lẻ cho đến số cuối cùng trong mảng.
2.1 Nếu mảng còn 1 phần tử (số cần tìm) > Kết thúc giải thuật.
2.2 Nếu số cuối cùng trong mảng đã bị loại > Làm lại bước 1.
2.3 Nếu số cuối cùng trong mảng chưa bị loại > Làm lại bước 2.
3. Số cần tìm là phần tử còn lại duy nhất trong mảng.
(Lưu ý : Bài này có sử dụng thuật toán đệ quy)
 
Upvote 0
Web KT
Back
Top Bottom