Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: đếm số lần xuất hiện của các phần tử ?

  1. #1
    Ngày gia nhập
    12 2007
    Bài viết
    8

    Smile đếm số lần xuất hiện của các phần tử ?

    ví dụ nhập vào : 12311
    thì cho ra:

    số 1 xuất hiện 3 lần
    số 2 xuất hiện 1 lần
    số 3 xuất hiện 1 lần

    x-------------------------------------------x

    các bác gợi ý em cách làm với
    ai rảnh code luôn cho em cũng dc

    x-------------------------------------------x

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Anh rảnh anh code cho em được không ? Đừng ngụy trang kiểu Úc nữa em nhé T_T :
    C++ Code:
    1. #include <iostream>
    2. #include <map>
    3. #include <vector>
    4.  
    5. void addDigitToVector( std::vector< int >& con, int number )
    6. {
    7.     while( number != 0 )
    8.     {
    9.         con.push_back( number % 10 );
    10.         number = number / 10;
    11.     }
    12.    
    13.     /*
    14.         - Chỗ này ta dùng kĩ thuật shrink-to-fit
    15.         Nói nôm na là không để cho vector có quá nhiều
    16.         phần tử dư vì khi dùng push_back() thì mỗi lần
    17.         như vậy nó sẽ grow lên double size hiện tại.\
    18.         - Cậu có thể bỏ dòng 1 để xem capacity của vector
    19.         sau khi push_back().
    20.         - Nếu vẫn chưa hiểu, post lại hỏi, tui sẽ giải thích
    21.         tiếp.
    22.     */
    23.     std::vector< int >( con ).swap( con );                 // 1
    24.     std::cout << "Capacity = " << con.capacity() << "\n";    // 2
    25. }
    26.  
    27.  
    28. void showStatictisOfMap( const std::map< int, int >& mm )
    29. {
    30.     std::map< int, int >::const_iterator iter;
    31.     for( iter = mm.begin(); iter != mm.end(); ++iter )
    32.     {
    33.         std::cout << iter->first << " occurs  " << iter->second << " time( s ).";
    34.         std::cout << "\n";
    35.     }
    36. }
    37.  
    38. /*
    39.     - Khử tham chiếu iter cho ra giá trị của second vì map
    40.     sẽ nhận 1 std::pair< int, int >
    41.     - Và 1 điểm nữa là std::map không cho giá trị trùng,
    42.     tức là mỗi giá trị của first là duy nhất.
    43.     - ++mm sẽ tăng số lần của first key ở đây là số
    44.     lần xuất hiện của phần tử
    45. */
    46. void countOccurences( const std::vector< int >& con, std::map< int, int >& mm )  
    47. {
    48.     std::vector< int >::const_iterator iter;
    49.     for( iter= con.begin(); iter != con.end(); ++iter )
    50.          ++mm[ *iter ];
    51. }
    52.  
    53.  
    54. int main()
    55. {
    56.     int                number;    // Số nhập vào
    57.     std::vector< int > num_cont;  // Container chứa các phần tử
    58.  
    59.     std::cout << "Please input a number : ";
    60.     std::cin >> number;
    61.    
    62.     // Cắt số nhập vào ra thành chữ số
    63.     // và bỏ nó vào container ( chỗ này là vector< int > )
    64.     addDigitToVector( num_cont, number );
    65.  
    66.     // Tạo 1 map chứa các phần tử và số lần xuất hiện.
    67.     // Mặc định của map< key, elem > sẽ tự động sort
    68.     // với toán tử less<> ( operator < )
    69.     std::map< int, int > mm;
    70.     countOccurences( num_cont, mm );
    71.     showStatictisOfMap( mm );
    72.  
    73.     return 0;
    74. }

  3. #3
    Ngày gia nhập
    02 2008
    Nơi ở
    AYS 107
    Bài viết
    41

    Talking Count on occurence

    Trích dẫn Nguyên bản được gửi bởi longbodie Xem bài viết
    ví dụ nhập vào : 12311
    thì cho ra:

    số 1 xuất hiện 3 lần
    số 2 xuất hiện 1 lần
    số 3 xuất hiện 1 lần

    x-------------------------------------------x

    các bác gợi ý em cách làm với
    ai rảnh code luôn cho em cũng dc

    x-------------------------------------------x
    Nếu nhập toàn số thui thì có cách này đơn giản, mình không bit về C++ nên code bằng C và nếu có giống cách trên thì nhờ mấy anh mod xóa hộ bài này nhé:

    C Code:
    1. #include <stdio.h>
    2.  
    3. #define SIZE '9'-'0'+1
    4. #define MAX 1000
    5.  
    6. main()
    7. {
    8.   char s[MAX];
    9.   int count[SIZE]; /*count[i] sẽ đếm số lần xuất hiện của i*/
    10.   int i;
    11.   printf("Nhap di: ");
    12.   gets(s);
    13.   for(i=0;i<SIZE;i++)
    14.     count[i]=0;
    15.   for(i=0;s[i]!='\0';i++)
    16.     ++count[s[i]-'0']; /*Nếu gặp số i sẽ tăng count[i] lên vì i=s[i]-'0'*/
    17.   for(i=0;i<SIZE;i++)
    18.     if(count[i]!=0)
    19.       printf("So lan xuat hien cua %d là %d\n",i,count[i]);
    20. }
    Đã được chỉnh sửa lần cuối bởi developer : 25-08-2008 lúc 10:25 AM.
    I don't wanna waste another day

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Cho tui hỏi tí là cậu run code của cậu chưa vậy ? int s[ MAX ] thì làm sao cậu dùng với gets( ) ? Còn ý tưởng thì có lẽ dễ hiểu hơn !
    C++ Code:
    1. printf("\n")
    Semicolon !!!!

  5. #5
    Ngày gia nhập
    02 2008
    Nơi ở
    AYS 107
    Bài viết
    41

    À quên đó là char s[MAX], đầu óc chán quá. Sorry
    Đã được chỉnh sửa lần cuối bởi developer : 25-08-2008 lúc 09:31 AM.
    I don't wanna waste another day

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định đếm số lần xuất hiện của các phần tử ?

    Dù sao đi nữa code vẫn chưa đúng ! Không in ra kết quả được ! Cậu kiểm tra lại xem !

  7. #7
    Ngày gia nhập
    02 2008
    Nơi ở
    AYS 107
    Bài viết
    41

    Mình sửa lại rồi đó. Hii, cảm ơn cậu nhiều!! Giờ chạy tốt rồi.
    I don't wanna waste another day

  8. #8
    Ngày gia nhập
    12 2007
    Bài viết
    8

    cám ơn các anh ! Em mới chỉ võ sĩ hạng ruồi thôi
    @ anh rox_rook : Bài của anh kiến thức cao em chưa học ạ
    @ anh developer : bài anh làm em cũng khó hiểu quá, với lại em dùng VC++ 6.0 thì chạy báo lỗi .....

    Em có ý tưởng thế này,

    -đầu tiên cho biến đếm dem= 1;
    - Kiểm tra phần tử thứ nhất với tất cả phần tử còn lại,nếu thấy lăp lại thì tăng biến đếm lên 1

    mã em làm như sau : (n là giới hạn của mảng)

    for (int i=0; i<n; i++)
    {
    for (j=i+1; j<n; j++)
    {
    if (a[i]==a[j])
    {
    dem=dem+1;
    {
    print (so lan xuat hien cua a[i] la dem lan)
    dem= 1;
    {
    {
    như vậy nếu nhập vào mảng là : 1231

    thì nó sẽ ra :
    số 1 xuất hiện 2 lần
    số 2 xuất hiện 1 lần
    số 3 xuất hiện 1 lần
    số 1 xuất hiện 1 lần

    cái này của em nó đếm tất các phần tử , em muốn bây giờ nếu gặp phần tử đã đếm rồi thì nó bỏ qua và quay về vòng lặp, nghĩa là:

    for (int i=0; i<n-1; i++)
    {
    (kiểm tra xem a[i] đã xuất hiện chưa, nếu rồi thì quay lại vòng lặp luôn, tăng i lên 1 mà không đi xuống dưới nữa)

    for (j=i+1; j<n; j++)
    {


    if (a[i]==a[j])
    {
    dem=dem+1;
    {
    print (so lan xuat hien cua a[i] la dem lan)
    dem= 1;
    {
    {
    các anh hiểu ý em không ạ? các anh chỉ em cách làm chỗ này với !
    Đã được chỉnh sửa lần cuối bởi longbodie : 25-08-2008 lúc 06:45 PM.

  9. #9
    Ngày gia nhập
    02 2008
    Nơi ở
    AYS 107
    Bài viết
    41

    À ý tưởng của cách tớ là thế này: Cậu sẽ dùng một mảng để lưu số lần xuất hiện của các kí tự. Do nhập toàn số thôi, nên mảng sẽ gồm 10 phần tử, đếm các số từ 0-->9, phải không?? Gọi cái mảng này là
    Code:
    int count[10];
    và gán cho các phần tử ban đầu bằng 0 nhé
    Ta mặc định coi rằng, count[i] sẽ đếm số lần xuất hiện của phần tử i. Ví dụ count[0] sẽ đếm số lần xuất hiện của 0, count[1] sẽ đếm số lần xuất hiện của 1....
    Khó hiểu nhất chắc ở cái chỗ s[i]-'0' đúng không?? s[i] sẽ là một trong các giá trị từ '0'-->'9'(s[i] có kiểu char mà), nên s[i]-'0' sẽ một trong các giá trị từ 0-->9. Ví dụ s[i]='7', thì số dùng đếm '7' chính là count[7], phải tăng count[s[i]-'0'] lên.
    Đó mình chỉ biết giải thích thế thôi, bài này mình dịch bằng gcc của LINUX, chạy tốt mà. Chắc C++ phải thêm vài cái thư viện, chẳng biết nữa, mù về cái này mà

    Còn về ý tưởng của cậu, chắc gặp chút khó khăn, bây giờ cậu sắp xếp lại mảng rồi làm theo cách của cậu xem nào!!! Chắc là được thôi. Và đơn giản hơn nhiều. Sắp xếp rồi không sợ thằng đằng sau có lặp hay không, cứ thế mà tiến
    Đã được chỉnh sửa lần cuối bởi developer : 25-08-2008 lúc 04:09 PM.
    I don't wanna waste another day

  10. #10
    Ngày gia nhập
    12 2007
    Bài viết
    8

    Trích dẫn Nguyên bản được gửi bởi developer Xem bài viết
    À ý tưởng của cách tớ là thế này: Cậu sẽ dùng một mảng để lưu số lần xuất hiện của các kí tự. Do nhập toàn số thôi, nên mảng sẽ gồm 10 phần tử, đếm các số từ 0-->9, phải không?? Gọi cái mảng này là
    Code:
    int count[10];
    và gán cho các phần tử ban đầu bằng 0 nhé
    Ta mặc định coi rằng, count[i] sẽ đếm số lần xuất hiện của phần tử i. Ví dụ count[0] sẽ đếm số lần xuất hiện của 0, count[1] sẽ đếm số lần xuất hiện của 1....
    Khó hiểu nhất chắc ở cái chỗ s[i]-'0' đúng không?? s[i] sẽ là một trong các giá trị từ '0'-->'9'(s[i] có kiểu char mà), nên s[i]-'0' sẽ một trong các giá trị từ 0-->9. Ví dụ s[i]='7', thì số dùng đếm '7' chính là count[7], phải tăng count[s[i]-'0'] lên.
    Đó mình chỉ biết giải thích thế thôi, bài này mình dịch bằng gcc của LINUX, chạy tốt mà. Chắc C++ phải thêm vài cái thư viện, chẳng biết nữa, mù về cái này mà

    Còn về ý tưởng của cậu, chắc gặp chút khó khăn, bây giờ cậu sắp xếp lại mảng rồi làm theo cách của cậu xem nào!!! Chắc là được thôi. Và đơn giản hơn nhiều. Sắp xếp rồi không sợ thằng đằng sau có lặp hay không, cứ thế mà tiến
    Ý tưởng hay quá, nhờ nó mà em đã làm được
    đầu tiên sắp xếp mảng theo thứ tự tăng dần (hoặc giảm dần)
    như vậy giải quyết dc cái khúc của bài code của em bên trên

    for (int i=0; i<n-1; i++)
    {
    (kiểm tra xem a[i] đã xuất hiện chưa, nếu rồi thì quay lại vòng lặp luôn, tăng i lên 1 mà không đi xuống dưới nữa)

    for (j=i+1; j<n; j++)
    {


    if (a[i]==a[j])
    {
    dem=dem+1;
    {
    print (so lan xuat hien cua a[i] la dem lan)
    dem= 1;
    {
    {
    cái dòng màu đỏ bây h chỉ cần kiểm tra a[i] với a[i-1], nếu == nhau thì quay lại vòng lặp luôn (continue) nếu # mới đi xuống tiếp

    Em đã code dc thành công:
    Cám ơn các bác nhiều lắm , yêu lắm cơ
    Đã được chỉnh sửa lần cuối bởi longbodie : 25-08-2008 lúc 06:46 PM.

Các đề tài tương tự

  1. Xuất 1 kiểu dữ liệu là phân số mà không cần phải gọi qua hàm xuất trong class ?
    Gửi bởi giacmo1612 trong diễn đàn Nhập môn lập trình Java
    Trả lời: 4
    Bài viết cuối: 24-03-2012, 02:38 PM
  2. Trả lời: 0
    Bài viết cuối: 08-09-2011, 10:14 PM
  3. Bài tập C++ nhập mảng gồm n (5<n<10) phần tử, xuất mảng và xuất ra các số nguyên tố của mảng
    Gửi bởi viettan trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 08-01-2011, 10:23 PM
  4. Hỏi về tần xuất xuất hiện của một phần tử trong mảng
    Gửi bởi A10932 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 01-04-2008, 05:00 PM
  5. bài toán tìm số lần xuất hiện các phần tử xuất hiện trong 1 chuỗi
    Gửi bởi tuan_anhhhh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 11-03-2008, 09:30 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn