Tìm giá trị xuất hiện nhiều nhất trong mảng và số lần xuất hiện?

Tìm giá trị xuất hiện nhiều nhất trong mãng và số lần xuất hiện

#include<stdio.h>
#include<conio.h>
#include<math.h>
void nhapmang(int a[],int n)
{
	for(int i=0;i<n;i++)
	{
		printf(" Phan tu a[%d]: ",i);
	    scanf("%d",&a[i]);
	}
}
void xuatmang(int a[],int n)
{
	for(int i=0;i<n;i++)
	{
		printf("%3d",a[i]);
	}
}
int Timsolanxuathien(int a[],int n)
{
	sapxeptangdan(a,n);
	int max=0;
	int dem=1;
	for(int i=0;i<n;i++)
	{
		if(a[i]==a[i+1])
		{
			dem++;
				if(dem>max)
				{
					max=dem;
				}	
			
		}
		else
		{
			
           dem=1;
		}
	}
	return max;

}
int main()
{ 
     int a[50],n;
     do
  {
      printf("\n Nhap so luong phan tu: ");
      scanf("%d",&n);
  if(n<=0)
	  printf(" Nhap n duong!");
  }
  while(n<=0);
  nhapmang(a,n);
  xuatmang(a,n);
  printf("\nMang sau khi xoa thoa yeu cau: ");
  int Nhieunhat= Timsolanxuathien(a,n);
  printf("\nSo lan nhat hien nhieu nhat la: %d",Nhieunhat);
  getch();
  return 0;
}

Em chỉ in ra đc số lần xuất hiện nhiều nhất thôi, Làm sao để xuất ra luôn phần tử xuất hiện nhiều nhất. Ai bổ sung giúp em với :blush:

Bài này làm vầy được không ^^
Đầu tiên viết một hàm đếm số lần xuất hiện của 1 phần tử bất kỳ trong mang. Sau đó so sánh số lần xuất hiện của lần lược các phần tử…

int CountX(int a[], int n, int x)
{
    //Cái này chắc tự viết được ^^
}


void SoLanXuatHien(int a[], int n)
{
     int max = a[0], vtMax = 0;
     for(int i= 0; i < n; i++)
    {
         if(max < CountX(a, n, a[i]))
            {
              max = CountX(a, n, a[i]);     
              vtMax = i;
            }
    }
   //xuat phan tu tai vi tri i + So lan 
}
1 Like

Bài này hình như bạn hỏi ở đây rồi mà: Tìm giá trị xuất hiện nhiều nhất và số lần xuất hiện trong MẢNG 1 chiều?

2 Likes
#include<stdio.h>
#include<conio.h>
int main(){
	//khai bao mangdem de chua so lan xuat hien cua moi phan tu co trong mangA.
	int mangA[50]={},soPhantu,mangdem[50]={};
	printf("Nhap so phan tu cua mang:");
	scanf("%d",&soPhantu);
	//Nhap mang.
	for(int i=0;i<soPhantu;i++){
		if(i==0)
			printf("Nhap gia tri cho cac phan tu trong mang:\n");
		printf("A[%d]=",i);
		scanf("%d",&mangA[i]);
	}
	for(int i=0;i<soPhantu;i++){
		int dem =1;//khoi tao bien dem bang 1 vi moi phan tu it nhat phai xuat hien 1 lan.
		mangdem[i]=dem;// so lan xuat hien cua phan tu MangA[i] se ung voi gia tri cua phantu mangdem[i]
		for(int j=i+1;j<soPhantu;j++){
			if(mangA[i]==mangA[j]){//kiem tra su xuat hien cua phan tu Mang[i] bang cach so sanh voi phan tu MangA[j],neu 2 phan tu nay bang nhau thi xuat hien them mot phan tu MangA[i] nua va phai tang dem len 1.
				mangdem[i]=++dem;
				for(int k=j;k<soPhantu;k++){//sau khi kiem tra neu phantu MangA[j]=MangA[j] thi sau khi tang bien dem len 1 va xoa phan tu MangA[j] de tranh lap lai viec dem phan tu do.
					mangA[k]=mangA[k+1];
				}
				soPhantu--;//giam so phan tu di 1 vi ta cua xoa di mot phan tu co gia tri bang phan tu Mang A[i]
				j--;//giam j de viec de tranh bo xot di 1 phan tu trong cac lan kiem tra sau.
			}
		}
	}
	int max=0,vi_tri=0;//bien max chua so lan xuat hien nhieu nhat,vi_tri de chua vi tri cua phan tu xuat hien nhieu nhat trong mangA
	for(int i=0;i<soPhantu;i++){
		if(mangdem[i]>max){//so sanh max voi cac phan tu trong mangdem neu phan tu mangdem[i] lon hon max thi gan cho max,dong thoi gan chi so i cho vi_tri
			max=mangdem[i];
			vi_tri=i;
		}
}
		printf("\nPhan tu thu %d trong mangA xuat hien nhieu nhat ,cu the la %d lan.\n",vi_tri+1,max);
	getch();
	return 0;
}
2 Likes

Chính xác rồi đấy

@Kelvin_Nguy_n để ý cách đặt tiêu đề nhé. Đừng đặt tiêu đề quá chung chung. Đạt đã sửa tiêu đề lại cho phù hợp.

Hehe =)) Nhờ vào your post mà mình đã xong bài này.
bonus: Xuất ra luôn phần tử xuất hiện nhiều nhất, ta làm như sau: ở hàm Timsolanxuathien, ta thêm 1 thằng int xuathiennn, viết code lại thành:

 for(int i=0;i<n;i++)
	{
		if(a[i]==a[i+1])
		{
			dem++;
				if(dem>max)
				{
					max=dem; xuathiennn=a[i];
				}	
			
		}
		else
		{
			
           dem=1;
		}
	}

Rồi trong hàm main, cùng vs dòng printf Số lần xuất hiện nn, ta in thêm xuathiennn (chính là phần tử xuất hiện nn).

oops! hình như ở trên đã có người viết rồi :slight_smile:
Klq nhưng có một bài có một phần dùng cái code ở trên để giải trong Topcoder, tên là Aseries lấy 300 điểm mức Medium,mn có thể tham khảo để phát triển bài toán hơn.
Chúc mn 1 ngày tốt lành :grinning:

tìm csc dài nhất https://github.com/spa46/topcoder/wiki/03.-ASeries ?

#include <iostream>

using namespace std;

int main(){
	
	int n;
	cout<<"Nhap so luong phan tu: ";
	cin>>n;
	int arr[n];
	for(int i=0; i<n; i++){
		cout<<"Nhap phan tu thu " << i+1<<": ";
		cin>>arr[i];
	}
	int dem,max,count,so;
	int arrDem[n];
	for(int i=0; i<n; i++){
		dem = 0;		
		for(int j=0; j<n; j++){
			if(arr[i]==arr[j]){
				dem += 1;
			}
		}
		arrDem[i] = dem;
	}
	
	//Tim so lan xuat hien lon nhat
	max = arrDem[0];
	for(int i=0; i<n -1; i++){
		if(max < arrDem[i]){
			max = arrDem[i];
		}
	}
	for(int i=0; i<n; i++){
		count = 0;		
		for(int j=0; j<n; j++){
			if(arr[i]==arr[j]){
				count += 1;
			}
		}
		if(count == max){
			so = arr[i];
		}
	}
	
	cout<<"So xuat hien nhieu nhat la so: "<<so;
	return 0;
}

Đây là đoạn code tham khảo cho việc trong mảng có nhiều số đều có tần suất lớn nhất.

    int arrDem[] = {3,5,2,5,7,3,2,4,6,7,2,2,4,4,56,7,8,4,3,23,12,5,4,34,4,5,2,2,4,5,6,7,2,2,3,8,4};
    
    std::map<int, int> counters;
    for(auto &it: arrDem){
        if(counters.find(it) == counters.end())
            counters[it]=0;
        counters[it]++;
    }

    std::vector<std::pair<int,int>> maxFreqs;
    int maxCounter = 0;
    for(auto &it:counters){
        if(it.second>maxCounter){
            maxFreqs.clear();
            maxFreqs.push_back(it);
            maxCounter = it.second;
        }
        else if(it.second == maxCounter){
            maxFreqs.push_back(it);
        }
    }
    
    return maxFreqs;
// Results: std::vector(std::pair(2,8), std::pair(4,8)).
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?