Giúp thuật toán tìm số xuất hiện nhiều nhất trong 1 dãy.

Liên hệ QC

chuot0106

Thành viên gắn bó
Tham gia
20/1/13
Bài viết
2,567
Được thích
1,670
Giả sử tôi có 1 dãy số từ A1 đến A10 như sau:
3 4 5 3 7 4 3 5 7 3
Tôi muốn nhờ các thành viên giúp tôi thuật toán để có thể tìm ra số xuất hiện nhiều nhất trong dãy và cả số lần xuất hiện của nó nữa với. Cụ thể ở ví dụ này là số xuất hiện nhiều nhất là 3, số lần xuất hiện là 4.
 
Giả sử tôi có 1 dãy số từ A1 đến A10 như sau:
3 4 5 3 7 4 3 5 7 3
Tôi muốn nhờ các thành viên giúp tôi thuật toán để có thể tìm ra số xuất hiện nhiều nhất trong dãy và cả số lần xuất hiện của nó nữa với. Cụ thể ở ví dụ này là số xuất hiện nhiều nhất là 3, số lần xuất hiện là 4.
Dùng Dictionary nạp hết các con số này vào. Nạp lần đầu thì cho Item = 1, lần xuất hiện tiếp theo thì Item+1. Khi xong rồi dùng Max để tìm item nào lớn nhất rồi lấy Key của nó ra. Tuy nhiên nếu có 2 số xuất hiện nhiều lần như nhau thì lấy số nào?
 
Dùng Dictionary nạp hết các con số này vào. Nạp lần đầu thì cho Item = 1, lần xuất hiện tiếp theo thì Item+1. Khi xong rồi dùng Max để tìm item nào lớn nhất rồi lấy Key của nó ra.
Cảm ơn anh nhưng thực ra em định hỏi thuật toán bài này sau đó dùng pascal để giải. Mong mọi người tiếp tục giúp đỡ. Nếu như cách anh đưa thì không biết đưa vào pascal ra sao?
Tuy nhiên nếu có 2 số xuất hiện nhiều lần như nhau thì lấy số nào?
Không biết có lấy được cả 2 số không anh?
 
Cảm ơn anh nhưng thực ra em định hỏi thuật toán bài này sau đó dùng pascal để giải. Mong mọi người tiếp tục giúp đỡ. Nếu như cách anh đưa thì không biết đưa vào pascal ra sao?

Không biết có lấy được cả 2 số không anh?
Mình có biết pascal là gì đâu mà dám có ý kiến ý cò.
Nếu dùng VBA thì kiểu gì cũng lấy ra được hết
 
Giả sử tôi có 1 dãy số từ A1 đến A10 như sau:
3 4 5 3 7 4 3 5 7 3
Tôi muốn nhờ các thành viên giúp tôi thuật toán để có thể tìm ra số xuất hiện nhiều nhất trong dãy và cả số lần xuất hiện của nó nữa với. Cụ thể ở ví dụ này là số xuất hiện nhiều nhất là 3, số lần xuất hiện là 4.

Lập trình chi cho mất công
=MODE(A1:A10) ---> Cho kết quả =3
Còn đếm số lần xuất hiện thì COUNTIF
----------------
Cảm ơn anh nhưng thực ra em định hỏi thuật toán bài này sau đó dùng pascal để giải.
Không biết trong Pascal có dùng được Dic không? Cứ cho là không, vậy thì ta cũng có thể dùng phép nối chuỗi, mỗi phần tử lấy vào sẽ nối với nhau thông qua 1 ký tự đặc biệt (để phân cách tránh nhầm). Sau đó dùng InStr để tìm xem có sự tồn tại của phần tử chuẩn bị đưa vào không, nếu có thì... làm gì đó tùy ý
 
Lần chỉnh sửa cuối:
Mình có biết pascal là gì đâu mà dám có ý kiến ý cò.
Nếu dùng VBA thì kiểu gì cũng lấy ra được hết
Pascal , VBA hay C++,... thì nó cũng chỉ là công cụ thực để giải quyết các bài toán cụ thể thôi mà anh. Nếu có thuật toán thì em nghĩ dùng công cụ nào cũng giải quyết được hết ạ!

Lập trình chi cho mất công
=MODE(A1:A10) ---> Cho kết quả =3
Còn đếm số lần xuất hiện thì COUNTIF
Thực ra em muốn nhờ mọi người trên GPE giúp đỡ thuật toán sau đó em chuyển qua pascal để làm thầy ạ.
 
Chỉnh sửa lần cuối bởi điều hành viên:
bạn code thử như vậy xem sao? nếu code không đuợc tôi sẽ giúp.
bạn viết 1 function để tìm số lần xuất hiện của 1 số là bao nhiêu lần(số cần kiểm tra là 1 tham trị)
hàm main bạn cho duyệt từ đầu dãy cho tới cuối dãy.cứ mỗi số là gọi lại hàm tìm số lần xuất hiện rồi so sánh với nhau xem số nào xuất hiện nhiều lần nhất rồi đưa ra đáp số( hàm main này bạn sử dụng thuật toán tìm max kỹ thuật sử dụng lính canh là ok)
 
Giả sử tôi có 1 dãy số từ A1 đến A10 như sau:
3 4 5 3 7 4 3 5 7 3
Tôi muốn nhờ các thành viên giúp tôi thuật toán để có thể tìm ra số xuất hiện nhiều nhất trong dãy và cả số lần xuất hiện của nó nữa với. Cụ thể ở ví dụ này là số xuất hiện nhiều nhất là 3, số lần xuất hiện là 4.

Đây là bài toán tin lập trình cơ bản : Số phần tử, tìm max, cờ chặn.... (1 thủ tục cũng có thể giải quyết xong). Hôm trước thấy bạn nói em bạn thi TIN HỌC TRẺ, .. vậy chỉ cần hỏi em bạn là xong, bài này chắc chắn em ấy biết, đâu phải hỏi xa
 
Giả sử tôi có 1 dãy số từ A1 đến A10 như sau:
3 4 5 3 7 4 3 5 7 3
Tôi muốn nhờ các thành viên giúp tôi thuật toán để có thể tìm ra số xuất hiện nhiều nhất trong dãy và cả số lần xuất hiện của nó nữa với. Cụ thể ở ví dụ này là số xuất hiện nhiều nhất là 3, số lần xuất hiện là 4.
Lâu lắm không đụng Pascal rồi, nhưng có lẽ là thế này chăng:
1. Khai báo 2 mảng:
Arr1: Array[1 to 10] of Integer; Arr2: [1 to 10, 1 to 2] of Integer; (số 10 có thể thay bởi 1 hằng số trước đó)
Trong đó, Arr1 là mảng chứa dữ liệu đầu vào, Arr2 là mảng ghi nhận số lần xuất hiện của các giá trị trong mảng Arr1.

2. Duyệt từ đầu đến cuối mảng Arr1 và ghi số lần xuất hiện các giá trị vào mảng Arr2 (mảng Arr2 có 2 "cột", "cột" 1 chứa giá trị và "cột" 2 chứa số lần xuất hiện của giá trị đó, kiểu như bảng phân bố tần số trong thống kê vậy). Có thể sẽ không dùng đến cả 10 "hàng" mà chỉ dùng đến k "hàng" thôi (k<=10)

3. Duyệt mảng Arr2 (chỉ cần đến k "hàng" thôi), dựa vào Max của "cột" 2 để lấy ra giá trị tương ứng ở "cột" 1. Giá trị này chính là giá trị cần tìm.
 
Lần chỉnh sửa cuối:
bạn code thử như vậy xem sao? nếu code không đuợc tôi sẽ giúp.
bạn viết 1 function để tìm số lần xuất hiện của 1 số là bao nhiêu lần(số cần kiểm tra là 1 tham trị)
hàm main bạn cho duyệt từ đầu dãy cho tới cuối dãy.cứ mỗi số là gọi lại hàm tìm số lần xuất hiện rồi so sánh với nhau xem số nào xuất hiện nhiều lần nhất rồi đưa ra đáp số( hàm main này bạn sử dụng thuật toán tìm max kỹ thuật sử dụng lính canh là ok)
Nếu vậy mỗi lần tìm đếm số lần xuất hiện sẽ phải dùng mảng để lưu giá trị đó vào rồi mới có thể so sánh được đúng không bạn?

Đây là bài toán tin lập trình cơ bản : Số phần tử, tìm max, cờ chặn.... (1 thủ tục cũng có thể giải quyết xong). Hôm trước thấy bạn nói em bạn thi TIN HỌC TRẺ, .. vậy chỉ cần hỏi em bạn là xong, bài này chắc chắn em ấy biết, đâu phải hỏi xa
Đây là bài của thằng em nó hỏi mình đó bạn! Nó cũng chưa nghĩ ra cách giải. Nó mới học lớp 8 thôi.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Function solanxuathien(rngs As Range, n As Long) As Byte
Dim solan As Byte
Dim cll As Range
solan = 0
For Each cll In rngs
If (cll.Value = n) Then
solan = solan + 1
End If
Next
solanxuathien = solan
End Function


Function So_Xuat_hien_nhieu(rngs As Range) As Byte
Dim dem As Byte
Dim max As Byte
Dim cll As Range
dem = 0
max = 0
For Each cll In rngs
If (dem < solanxuathien(rngs, cll.Value)) Then
dem = solanxuathien(rngs, cll.Value)
max = cll.Value
End If
Next
So_Xuat_hien_nhieu = max
End Function
 

File đính kèm

  • Book1.xlsm
    14.6 KB · Đọc: 32
Lần chỉnh sửa cuối:
Đây là bài của thằng em nó hỏi mình đó bạn! Nó cũng chưa nghĩ ra cách giải. Nó mới học lớp 8 thôi.

Vậy hãy tập hợp các ý trên, và nói nó hãy suy nghĩ đơn giản từng bước, nếu tự ta làm ngoài giấy làm sao (tìm số xuất hiện nhiều bằng bút, giấy với dãy số 100 số chẳng hạn), thì từ đó mới hình dung lập trình như thế, phải tập tư duy thế, thì mới quen dần và thi được. Đọc các ví dụ khác nữa, từ đó đưa ra cách làm của riêng mình, rồi mang lại đây hỏi.

Còn nếu chỉ luôn cách đầy đủ, thì hôm sau gặp bài khác chút lại tắc tỵ, tập thế sẽ quen dần và vào thi không choáng.
 
Lâu lắm không đụng Pascal rồi, nhưng có lẽ là thế này chăng:
1. Khai báo 2 mảng:
Arr1: Array[1 to 10] of Integer; Arr2: [1 to 10, 1 to 2] of Integer; (số 10 có thể thay bởi 1 hằng số trước đó)
Trong đó, Arr1 là mảng chứa dữ liệu đầu vào, Arr2 là mảng ghi nhận số lần xuất hiện của các giá trị trong mảng Arr1.

2. Duyệt từ đầu đến cuối mảng Arr1 và ghi số lần xuất hiện các giá trị vào mảng Arr2 (mảng Arr2 có 2 "cột", "cột" 1 chứa giá trị và "cột" 2 chứa số lần xuất hiện của giá trị đó, kiểu như bảng phân bố tần suất trong thống kê vậy). Có thể sẽ không dùng đến cả 10 "hàng" mà chỉ dùng đến k "hàng" thôi (k<=10)

3. Duyệt mảng Arr2 (chỉ cần đến k "hàng" thôi), dựa vào Max của "cột" 2 để lấy ra giá trị tương ứng ở "cột" 1. Giá trị này chính là giá trị cần tìm.
Thuật toán của anh thì em hiểu nhưng bài này không dùng mảng 2 chiều được vì sử dụng kiến thức chương trình pascal 8 thôi anh ạ. Lớp 8 các em nó mới học mảng 1 chiều thôi. Khó khăn thật đó.
 
bài này là dạng bài tập duyệt trên mảng 1 chiều thôi
 
Function solanxuathien(rngs As Range, n As Long) As Byte
Dim solan As Byte
Dim cll As Range
solan = 0
For Each cll In rngs
If (cll.Value = n) Then
solan = solan + 1
End If
Next
solanxuathien = solan
End Function
Function So_Xuat_hien_nhieu(rngs As Range) As Byte
Dim dem As Byte
Dim max As Byte


Dim cll As Range
dem = 0
max = 0
For Each cll In rngs
If (dem < solanxuathien(rngs, cll.Value)) Then
dem = solanxuathien(rngs, cll.Value)
max = cll.Value
End If
Next
So_Xuat_hien_nhieu = max
End Function
Hàm của anh chính xác rồi. Anh có biết pascal không ạ? Nếu biết mong anh chuyển giúp em qua ngôn ngữ này với ạ!
 
Bạn thử code sau, 20 năm rồi không sờ đến Pascal nên không rõ có chính xác không, nhất là chỗ Exit để thoát vòng lặp For, nếu kết quả không đúng thì dùng Goto ra ngoài (nhưng Pascal không khuyến khích).
Mã:
Var   i, j, k:integer;
         a, b: array [1..10] of integer;
Begin
    max:=1;
    k:=1;
    b[1]:=1;
    Readln(a[1]);
    For i:=2 to 10 do
      Begin
         Readln(a[i]);
         For j:=i-1 downto 1 do
             Begin
                 If  a[i]=a[j] then
                   Begin
                     b[i]:=b[j]+1;
                     Exit;
                   End;
                  b[i]:=1;
             End;
          If b[i]>max then
             Begin
                 max:=b[i];
                 k:=i;
             End;
        End;
  Writeln(a[k],max);
End.
 
Lần chỉnh sửa cuối:
Bạn thử code sau, 20 năm rồi không sờ đến Pascal nên không rõ có chính xác không, nhất là chỗ Exit để thoát vòng lặp For, nếu kết quả không đúng thì dùng Goto ra ngoài (nhưng Pascal không khuyến khích).
Mã:
Var   i, j, k:integer;
         a, b: array [1..10] of integer;
Begin
    max:=1;
    k:=1;
    b[1]:=1;
    Readln(a[1]);
    For i:=2 to 10 do
      Begin
         Readln(a[i]);
         For j:=i-1 downto 1 do
             Begin
                 If  a[i]=a[j] then
                   Begin
                     b[i]:=b[j]+1;
                     Exit;
                   End[COLOR=#ff0000][B];[/B][/COLOR]
                Else b[i]:=1;
             End;
          If b[i]>max then
             Begin
                 max:=b[i];
                 k:=i;
             End;
        End;
  Writeln(a[k],max);
End.
Cảm ơn bạn nhiều! Tôi Test thử luôn xem sao? Mà hình như trước Else không có dấu ";" bạn ạ.
 
Bạn thử code sau, 20 năm rồi không sờ đến Pascal nên không rõ có chính xác không, nhất là chỗ Exit để thoát vòng lặp For, nếu kết quả không đúng thì dùng Goto ra ngoài (nhưng Pascal không khuyến khích).
Mã:
Var   i, j, k:integer;
         a, b: array [1..10] of integer;
Begin
    max:=1;
    k:=1;
    b[1]:=1;
    Readln(a[1]);
    For i:=2 to 10 do
      Begin
         Readln(a[i]);
         For j:=i-1 downto 1 do
             Begin
                 If  a[i]=a[j] then
                   Begin
                     b[i]:=b[j]+1;
                     Exit;
                   End;
                  b[i]:=1;
             End;
          If b[i]>max then
             Begin
                 max:=b[i];
                 k:=i;
             End;
        End;
  Writeln(a[k],max);
End.
Bạn xem lại hộ tôi với. trong chương trình bạn viết nếu tôi bỏ lệnh exit đi thì nó in ra số xuất hiện nhiều nhất nhưng số lần xuất hiện thì nó in sai luôn cho kết quả là 1.
 
Web KT
Back
Top Bottom