em muốn rút gọn code nó lại vì quá dài . ý tưởng rút gọn thì càng tốt 
cảm ơn mọi người vì đã xem
void DemChuSoXuatHienNN(int a[][MAX], int row, int column)
{
int b[MAX]; // mảng chứa từng chữ số trong mảng 2 chiều
int c[MAX]; // mảng chứa từng chữ số sau khi khoa những số trùng
int d[MAX]; // mảng chứa số đếm
int indexb = 0;
int donvi;
// B1 : Tách từng chữ số thành mảng 1 chiều
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
while (a[i][j] != 0)
{
donvi = a[i][j] % 10; // lay hang don vi
b[indexb++] = donvi;
a[i][j] = a[i][j] / 10; // mat di mot don vi
}
}
}
int indexc = 0;
// Gán b[i] vào c[i]
for (int i = 0; i < indexb; i++)
{
c[i] = b[i]; // gán b[i] vào c[i]
indexc++;
}
// Xóa những số trùng trong mảng c[i]
for (int i = 0; i < indexc - 1; i++)
{
for (int j = i + 1; j < indexc; j++)
{
if (c[i] == c[j])
{
HamXoa(c, indexc, j); // hàm xóa những số trùng
j--;
}
}
}
// Đếm từng chữ số trong mảng c xuất hiện trog mảng d
int indexd = 0;
for (int i = 0; i < indexc; i++)
{
int dem = 0;
for (int j = 0; j < indexb; j++)
{
if (c[i] == b[j])
{
dem++;
indexd++; // tang độ dài của mảng lên
}
}
d[i] = dem; // gán số đếm vào mảng d
}
// So Sánh tìm đếm lớn nhất
int MaxDem = d[0];
for (int i = 1; i < indexd; i++)
{
if (MaxDem < d[i])
{
MaxDem = d[i];
}
}
// So d cai nao bang MaxDem thi Xuat ra
for (int i = 0; i < indexd; i++)
{
if (d[i] == MaxDem)
{
int value = c[i]; // gán giá trị có số đếm = MaxDem vào value
cout << "Mang co chu so xuat hien nhieu nhat la " << value << " Voi " << MaxDem << "Xuat hien " << endl;
}
}
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?