Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: In ra màn hình phần tử xuất hiện nhiều nhất trong mảng?

  1. #1
    Ngày gia nhập
    05 2011
    Bài viết
    7

    Mặc định In ra màn hình phần tử xuất hiện nhiều nhất trong mảng?

    Mình có bài tập như sau: "Nhập vào một mảng số nguyên n từ bàn phím, in ra màn hình phần tử có số lần lặp nhiều nhất trong mảng vừa lập."

    VD: Mảng có 5 phần tử 2,2,1,1,3 in ra là: phần tử 1 và 2 lặp nhiều nhất (2 lần).

    Mình đã làm bài tập này nhưng với mảng như trên chương trình chỉ hiện ra: phần tử 2 lặp nhiều nhất (2 lần). Các bạn có thể giúp mình sửa lại code để đúng trong trường hợp trên không? Mình cảm ơn.
    Code:
    #include <stdio.h>
    main()
    {
        int i,n,j,name,dem[100],a[100],max;
    
        printf("Nhap vao so phan tu cua mang: ");
        scanf("%d",&n);
    
        for (i=0;i<n;i++)
        {
             printf("a[%d] = ",i);
             scanf("%d",&a[i]);
        }
    
        for (i=0;i<n;i++)
            dem[i]=1;
    
    
        for (i=0;i<n-1;i++)
             for (j=i+1;j<n;j++)
                  if (a[i]==a[j])
                      dem[i]++;
    
        max=dem[0];
        name=a[0];
    
        for (i=1;i<n;i++)
             if (max<dem[i]) {max=dem[i];
                              name=a[i];}
    
        printf("Phan tu %d xuat hien nhieu nhat (%d lan)",name,max);
    }
    Đã được chỉnh sửa lần cuối bởi viethai1431 : 06-08-2011 lúc 04:53 PM.

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    59

    mình đã code thử một bài như sau bạn coi tham khảo:

    C Code:
    1. #include <stdio.h>
    2. #define MAX 100
    3. //Prototype
    4. void Input(int [MAX], int);
    5. void Count(int [MAX], int [MAX], int * );
    6. void Print(int [MAX], int [MAX], int );
    7.  
    8. main()
    9. {
    10.     int n, a[MAX], b[MAX];
    11.    
    12.     printf("Nhap vao so phan tu cua mang: ");
    13.     scanf("%d", &n);
    14.     Input(a, n);
    15.     //Print(a, b, n);
    16.     Count(a, b, &n);
    17.     printf("\n");
    18.     Print(a, b, n);
    19.    
    20.    
    21. }
    22. //input
    23. void Input(int a[MAX], int n)
    24. {
    25.     int i;
    26.    
    27.     for(i = 0;i < n; i++)
    28.     {
    29.         printf("Nhap a[%d]: ", i);
    30.         scanf("%d", &a[i]);
    31.     }
    32. }
    33.  
    34. //count array
    35. void Count(int a[MAX], int b[MAX], int *n )
    36. {
    37.     int i, j, t;
    38.    
    39.     //initialization
    40.     for(i = 0; i < *n; i++)
    41.     {
    42.         b[i] = 1;
    43.     }
    44.    
    45.     //count
    46.     for(i = 0; i < *n; i++)
    47.     {
    48.         for(j = i + 1; j < *n; j++)
    49.         {
    50.             if(a[i] == a[j])
    51.             {
    52.                 b[i]++;
    53.                 //del
    54.                 for(t = j; t < *n; t++)
    55.                 {
    56.                     a[t] = a[t + 1];
    57.                 }
    58.                 (*n)--;
    59.                 j--;
    60.             }
    61.         }
    62.     }
    63. }
    64.  
    65. void Print(int a[MAX], int b[MAX], int n)
    66. {
    67.     int i, flag = 0, max;
    68.    
    69.     max = b[0];
    70.     for(i = 1; i < n; i++)
    71.     {
    72.         if( b[i] > max)
    73.         {
    74.             max = b[i];
    75.         }
    76.     }
    77.    
    78.     //print result
    79.  
    80.     for( i = 0 ;i <  n; i++ )
    81.     {
    82.         if((b[i]  == max) && (flag == 0))
    83.         {
    84.             printf("Phan tu %d",a[i]);
    85.             flag = 1;
    86.             i++;
    87.         }
    88.         if((b[i]  == max) && (flag == 1))
    89.         {
    90.             printf(", %d", a[i]);
    91.         }
    92.     }
    93.    
    94.     printf(" la phan tu lap lai nhieu nhat (%d lan).\n", max);
    95. }

  3. #3
    Ngày gia nhập
    12 2010
    Nơi ở
    Hanoi, Vietnam, Vietnam
    Bài viết
    687

    mình có ý tưởng như thế này bạn code theo C nhá , mình không quen C lắm nên phải code theo C++ !
    thuật toán là :
    ban đầu cậu sắp xếp lại mảng theo quick sort nhá ( cái này độ phức tạp có 0(nlogn) thôi )
    sau khi sắp xếp xong bạn dùng 1 biến đếm chạy và 1 biến là kết quả lớn nhất và so sánh nếu mà 2 phần tử khác nhau thì gán lại biến đếm = 1 , không thì tăng lên 1 cứ thế cho đến hết mảng và so sánh với biến kết quả lớn nhất và gán cho nó;
    sau khi có được số lần xuất hiện nhiều nhất rồi thì bạn duyệt lại 1 lần nữa để xem những phần tử nào có cùng với số lần xuất hiện max !
    ( bài toán này tớ làm với độ phức tạp là 0(nlogn) thôi ,còn theo cách của cậu là 0 (n^2 ))

    C++ Code:
    1. #include<iostream>
    2. using namespace std;
    3.  
    4. // sap xep lai mang  theo quick sort
    5. void quick_sort ( int a[] , int l , int r )
    6. {
    7.      
    8.        if ( l > r ) return ;
    9.        int x = a[(l+r)/2];
    10.        int i = l , j = r;
    11.        while ( i < j )
    12.        {
    13.             while ( a[i] < x && i <=r ) i++;
    14.             while ( a[j] > x && j >= l ) j--;
    15.             if ( i <=j )
    16.             {
    17.                 swap(a[i],a[j]);
    18.                 i++; j--;
    19.             }
    20.         }
    21.     if ( l< j ) quick_sort(a,l,j);
    22.     if ( i < r) quick_sort(a,i,r);
    23. }
    24.  
    25. int main()
    26. {
    27.      
    28.         int a[9] = { 2 ,5,1,1,3,3,1,2,6};
    29.         quick_sort(a,0,8);
    30.         int count =1, result = 1;
    31.         // dung de tim so lan xuat hien nhieu nhat
    32.        
    33.         for ( int i = 0 ; i < 9 ; i++)
    34.         {
    35.              if ( a[i] != a[i+1] ) count = 1; // neu ma a[i] ! =a[i+1] thi van de bien count =1;
    36.              else count++; // khong thi tang no len
    37.              
    38.          // so sanh voi bien ket qua
    39.          
    40.            if ( result < count )
    41.            {
    42.                 result = count;
    43.                
    44.            }
    45.        
    46.         }
    47.         int count1=1;
    48.         cout << "\nCac so xuat hien nhieu nhat la : " ;
    49.         // duyet lai 1 lan nua de xem co nhung phan tu nao cung xuat hien voi so lan max
    50.        
    51.         for ( int i = 0 ; i < 9; i++)
    52.         {
    53.             if ( a[i] != a[i+1]) count1=1;
    54.             else count1++;
    55.             if ( count1== result)
    56.             {
    57.                 cout << a[i] << " , ";
    58.             }
    59.         }
    60.         cout << " \nVoi so lan xuat hien la : " << result ;
    61.         cin.get();
    62.         return 0;
    63. }

  4. #4
    Ngày gia nhập
    04 2011
    Nơi ở
    Heaven
    Bài viết
    90

    minh co doan code the nay hi vong giup duoc ban
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    void nhap(int* a,int& n);
    void xuat(int* a,int n);
    void timsolanlapnhieunhat(int* a,int n);
    int tim(int* a,int n,int x);
    void swap(int& a,int& b);
    int main()
    {
    	int n;
    	printf("\n Nhap vao so phan tu cua mang: ");
    	scanf("%d",&n);
    	int* a=(int*)malloc(n*sizeof(int));
    	nhap(a,n);
    	xuat(a,n);
    	printf("\n mang cac phan tu khac nhau \n");
    	timsolanlapnhieunhat(a,n);
    	getch();
    	return 0;
    }
    void nhap(int* a,int& n)
    {
    	int i;
    	for(i=0;i<n;i++)
    	{
    		printf("\n a[%d]",i);
    		scanf("%d",&a[i]);
    	}
    }
    void xuat(int* a,int n)
    {
    	int i;
    	for(i=0;i<n;i++)
    		printf("%6d",a[i]);
    }
    int search(int* a,int n,int x)
    {
    	int i;
    	int ok=0;
    	for(i=0;i<n;i++)
    		if(a[i]==x)
    		{
    			ok=1;
    			break;
    		}
    	return ok;
    
    
    }
    void timsolanlapnhieunhat(int* a,int n)//ham tim so phan tu co so lan lap nhieu nhat
    {
    	int i=0;
    	int* b=(int*)malloc(n*sizeof(int));
    	int t=0;
    	b[t++]=a[i];
    	for(i=1;i<n;i++)
    	{
    		if(search(b,n,a[i])==0)
    			b[t++]=a[i];
    	}
    	
    	for(i=0;i<t-1;i++)
    		for(int j=i+1;j<t;j++)
    			if(tim(a,n,b[i])<tim(a,n,b[j]))
    				swap(b[i],b[j]);
    	xuat(b,t);
    	int* c=(int*)malloc(t*sizeof(int));
    	int m=0;
    	c[m++]=b[0];
    	int temp=tim(a,n,b[0]);
    
    	for(i=1;i<t;i++)
    	{
    		if(tim(a,n,b[i])==temp)
    			c[m++]=b[i];
    	}
    	printf("\n so lan lap nhieu nhat la %d lan co % d phan tu la:",temp,m);
    	xuat(c,m);
    }
    int tim(int* a,int n,int x)//tim so lan lap cua mot phan tu
    {
    	int dem=0;
    	for(int i=0;i<n;i++)
    		if(a[i]==x)
    			dem++;
    	return dem;
    }
    void swap(int& a,int& b)
    {
    	int temp=a;
    	a=b;
    	b=temp;
    }

  5. #5
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Bài này cách giải dễ nhất là sắp xếp mảng.

    Tuy nhiên, nếu không muốn sắp sếp thì có thif dùng thủ thuật đếm dồn, thủ thuât hơi rắc rối nhưng không độ phức tạp không đến nổi lớn như thủ thuật đếm đầy đủ

    Theo kỹ thuật đếm dồn, nếu mảng a có k phần tử mang giá trị x thì phần tử x đầu tiên được đếm là 1, phần tử x thứ hai được đếm là 2, vv... và phần tử x thứ k được đếm là k.

    Giải thuật:

    - Mảng mang có n phần tử
    - Tạo mang dem cũng n phần tử, mọi giá trị = 1
    - Đọc mảng mang. Cứ mỗi phần tử thì lại tìm đến cuối mảng, gặp trị giống thì cộng số đếm vào phần tử tương ứng trên mảng đếm

    Như vậy, nếu ta có mảng

    a = { 1, 1, 3, 4, 7, 5, 1, 3, 9 }

    Thì sau khi duyệt xong, ta sẽ có mảng

    d = { 1, 2, 1, 1, 1, 1, 3, 2, 1 }

    Mảng d cho thấy, phần tử nhiều nhất là phần tử thứ 7, với 3 lần lặp lại.

    C Code:
    1. // đã có mảng a[], n phần tử
    2.  
    3. int d[MANGMAX] = {1};
    4.  
    5. int i, j, dem, dMax;
    6.  
    7. for (i=0, dMax=0; i < n; i++)
    8. {
    9.   if (d[i] > 1)  continue; // trị này đã đếm rồi, có thể lướt qua
    10.   for (j=i+1, dem=1; j < n; j++)
    11.       if (a[i] == a[j])  d[j] = ++dem; // cứ mỗi trị lặp lại thì tăng số đếm lên
    12.   if (dem > dMax)  dMax = dem;  // số đếm cao nhất
    13. }
    14.  
    15. if (dMax <= 1)
    16.   printf("Mảng không có phần tử nào lặp lại\n");
    17. else
    18.   for (i=0; i < n; i++)
    19.   {
    20.     if (d[i] >= dMax)
    21.       printf("số %d lặp lại nhiều nhất, với %d lần\n", a[i], d[i]);
    22.   }

  6. #6
    Ngày gia nhập
    12 2010
    Nơi ở
    Cần thơ
    Bài viết
    273

    Mặc định In ra màn hình phần tử xuất hiện nhiều nhất trong mảng?

    Thuật toán của tớ là xóa lần lượt....bác xem thử được không nhé
    C Code:
    1. #include <stdio.h>
    2.  
    3. void arr_del(int arr[],short unsigned int p,short unsigned int &n)
    4. {
    5.    for (short unsigned int i=p;i<n-1;i++) arr[i]=arr[i+1];
    6.    n--;
    7. }
    8. short int cnd(int Vdel[],int N,short unsigned int E)
    9. {
    10.    for (short unsigned int i=0;i<E;i++) if (N==Vdel[i]) return 0;
    11.    return 1;
    12. }
    13. void Delc(int a[],int Vdel[],short unsigned int &n)
    14. {
    15.    short unsigned int k=0;
    16.    for (short unsigned int i=0;i<n;i++)
    17.    if (cnd(Vdel,a[i],k))
    18.    {
    19.       Vdel[k++]=a[i];
    20.       arr_del(a,i,n);
    21.       i--;
    22.    }
    23. }
    24.  
    25. int main(void)
    26. {
    27.    int a[14]={1,1,2,3,2,1,2,3,5,5,5,4,5,1};
    28.    short unsigned int n=14;//Coi chừng sai chổ này
    29.    //Mảng đã có
    30.  
    31.    int Vdel[10];
    32.    for (int i=1;i<n;i++)
    33.       for (short unsigned int j=0;j<i;j++)
    34.       if (a[i]==a[j])
    35.       {
    36.          Delc(a,Vdel,n);
    37.          i-=2;
    38.          break;
    39.       }
    40.    for (short unsigned int i=0;i<n;i++) printf("%3d",a[i]);
    41.    scanf("%*c");
    42.    return 0;
    43. }
    Ai bất tài, tôi nhìn hoài chẳng thấy,
    Đi khắp phòng tôi lấy 1 tấm gương,
    Khẽ đặt lên một góc phía bức tường,
    Nhìn vào đó, tôi tận tường kẻ đó.

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

  1. Lập trình C++ Mình muốn hỏi về bài toán tìm số lần xuất hiện của ký tự nhiều nhất trong chuỗi và số lần xuất hiện
    Gửi bởi ducky 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: 06-09-2013, 11:17 AM
  2. Bài tập C Tạo ra 1 dãy số bất kì và tìm số xuất hiện nhiều nhất trong dãy
    Gửi bởi akiller12 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: 24-08-2013, 06:38 PM
  3. Tìm phần tử xuất hiện nhiều nhất trong mảng
    Gửi bởi thanhtung_tn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 25-05-2011, 08:48 AM
  4. Viết hàm tìm phần tử xuất hiện nhiều nhất trong mảng 1 chiều các số nguyên?
    Gửi bởi fire_dragon14988 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 46
    Bài viết cuối: 28-08-2010, 05:14 PM
  5. Tìm phần tử có số lần xuất hiện nhiều nhất trong mảng 1 chiều
    Gửi bởi Vaanres trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 06-08-2010, 10:12 AM

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