[C] 173 * Hãy viết hàm tìm chữ số xuất hiện ít nhất trong mảng

Tác giả:

  • Trần Hán Huy – tranhanhuy.wordpress.com

Sách:

  • Bài tập kĩ thuật lập trình C/C++ – Nguyễn Tấn Trần Minh Khang

Đề bài

  • 173 * Hãy viết hàm tìm chữ số xuất hiện ít nhất trong mảng

Phân tích

int i,So[10]={0},donvi,temp;
for (i=0;i<n;i++)
{
    temp = abs(a[i]);
    do
    {
        donvi = temp%10;
        temp = temp/10;
        So[donvi]++;
    } while (temp!=0);
}

Thông qua đoạn code trên ta hiểu thế này:

  • Chữ số: thì chỉ có từ 0 -> 9 nên khai báo 1 mảng So[10] gồm 10 phần tử và đều giá trị là 0. Giá trị tương ứng tần số xuất hiện trong mảng và Trị số tương ứng chữ số từ 0 – > 9
  • cho for duyệt hết từng phần tử của mảng để tránh việc thay đổi giá trị nên dùng biến temp để làm trung gian.
  • do while dùng để tách phần tử của mảng vừa lấy ra thành các chữ số.
  • đồng thời gắn vào dãy số từ 0->9 (dùng mảng số đế biểu diễn) bằng cách cho trị số tại vị trí tương ứng tăng lên.

VD: 12 34 134
temp = 12
vào do while thì đơn vị = 2 và temp = 1 và So[2] += 1

int VTMin = abs(a[0]%10);
for (i=0; i<10 ; i++)
{
    if (So[i]!=0)
    {
        VTMin = (So[VTMin]<So[i])?VTMin:i;
    }
}

sau khi thực hiện xong đoạn code 1 thì ta được 1 mảng số đã có giá trị khác nhau. theo vd trên.
VD: 12 34 134
thì ta dc 1 mảng số:
Trị số : 0 1 2 3 4 5 6 7 8 9
Giá trị: 0 2 1 2 2 0 0 0 0 0

như vậy để tìm chữ số xuất hiện ít nhất.
dựa vào giá trị của trị số đó. đối với ví dụ trên thì giá trị = 1 là thấp nhất thì số 2 là xuất hiện ít nhất trong mảng.

lưu ý:

  • ko có dựa vào số 0 vì 0 tương ứng là không tồn tại trong mảng
int ChuSoXuatItNhat(int a[], int n)
{
    int i,So[10]={0},donvi,temp;
    for (i=0;i<n;i++)
    {
        temp = abs(a[i]);
        do
        {
            donvi = temp%10;
            temp = temp/10;
            So[donvi]++;                            
        } while (temp!=0);
    }
    int VTMin = abs(a[0]%10);
    for (i=0; i<10 ; i++)
    {
        if (So[i]!=0)
        {
            VTMin = (So[VTMin]<So[i])?VTMin:i;
        }
    }
    return VTMin;
 }

Code

#include <stdio.h>
#include <math.h>
int ChuSoXuatItNhat(int a[], int n)
{
    int i,So[10]={0},donvi,temp;
    for (i=0;i<n;i++)
    {
        temp = abs(a[i]);
        do
        {
            donvi = temp%10;
            temp = temp/10;
            So[donvi]++;                            
        } while (temp!=0);
    }
    int VTMin = abs(a[0]%10);
    for (i=0; i<10 ; i++)
    {
        if (So[i]!=0)
        {
            VTMin = (So[VTMin]<So[i])?VTMin:i;
        }
    }
    return VTMin;
 }
void main()
{
    int a[6] = {11, 20, 31, 15, 12, 15};
    int n = 6;
    printf ("%d",ChuSoXuatItNhat(a,n));
}

4 responses to “[C] 173 * Hãy viết hàm tìm chữ số xuất hiện ít nhất trong mảng”

  1. Smalldevil says :

    code này chỉ đưa ra dc 1 số duy nhất, nếu có 2 số cùng xuất hiên ít nhất thì làm sao?

    • freb says :

      Sau khi có dc VTMin của mảng SO thì bạn lại duyệt lại 1 lần nữa cái mảng số này để xuất tất cả.
      so[0] = 1
      so[1] = 2
      so[2] = 1
      so[3] = 3
      so[4] = 1
      so[5] = 4
      so[6] = 1
      so[7] = 12
      so[8] = 3
      so[9] = 1
      sau hàm ChuSoXuatITNhat sẽ cho ra kết quả là vị trí 0
      Bạn thực hiện tiếp việc so sánh để lấy ra các vị trí 0,2,4,6,9

      sửa lại đoạn code trên chút nữa là ok

  2. JosTri says :

    neu mang co so phan tu > 100 >> 1000 … thi sao lam duoc
    Hay ta lam the the:
    tim phan tu xuat hien nhieu hon 1 lan o Mang a[]
    chuyen Phan tu ay qua Mang b[] va xoa no o Mang a[]
    So sanh Mang b[] voi Mang a[] neu a[i] == b[j]—>xoa a[i]
    Code:
    /*Tim Chu So Xuat Hien It Nhat Trong Mang*/
    #include
    using namespace std;
    #include
    #define S 100

    void Input(int a[], int n)
    {
    for(int i=0;i>a[i];
    }
    }
    void Swap(int &a, int &b)
    {
    int temp = a;
    a = b;
    b = temp;
    }
    void Arrange(int a[], int n)
    {
    int max;
    for(int i=0;i<n-1;i++)
    {
    max = i;
    for(int j=i+1;j a[j])
    {
    max = j;
    }
    }
    Swap(a[i],a[max]);
    }
    }
    void Delete(int a[], int &n, int vitri)
    {
    for(int i=vitri;i<n;i++)
    {
    a[i] = a[i+1];
    }
    n–;
    }

    void Output(int a[], int n)
    {
    for(int i=0;i<n;i++)
    {
    cout<<a[i]<<" ";
    }
    cout<<endl;
    }
    void Appear(int a[], int n)
    {
    int b[S];
    int count = 0;
    int count1 = 0;
    for(int i=0;i<n-1;i++)
    {
    if(a[i] == a[i+1])
    {
    count1++;
    b[count++] = a[i+1];
    Delete(a,n,i);

    }
    }
    for(int i=0;i<count1;i++)
    {
    for(int j=0;j>n;
    Input(a,n);
    Arrange(a,n);
    Appear(a,n);
    getch();
    }

  3. JosTri says :

    /*Tim Chu So Xuat Hien It Nhat Trong Mang*/
    #include
    using namespace std;
    #include
    #define S 100

    void Input(int a[], int n)
    {
    for(int i=0;i>a[i];
    }
    }
    void Swap(int &a, int &b)
    {
    int temp = a;
    a = b;
    b = temp;
    }
    void Arrange(int a[], int n)
    {
    int max;
    for(int i=0;i<n-1;i++)
    {
    max = i;
    for(int j=i+1;j a[j])
    {
    max = j;
    }
    }
    Swap(a[i],a[max]);
    }
    }
    void Delete(int a[], int &n, int vitri)
    {
    for(int i=vitri;i<n;i++)
    {
    a[i] = a[i+1];
    }
    n–;
    }

    void Output(int a[], int n)
    {
    for(int i=0;i<n;i++)
    {
    cout<<a[i]<<" ";
    }
    cout<<endl;
    }
    void Appear(int a[], int n)
    {
    int b[S];
    int count = 0;
    int count1 = 0;
    for(int i=0;i<n-1;i++)
    {
    if(a[i] == a[i+1])
    {
    count1++;
    b[count++] = a[i+1];
    Delete(a,n,i);

    }
    }
    for(int i=0;i<count1;i++)
    {
    for(int j=0;j>n;
    Input(a,n);
    Arrange(a,n);
    Appear(a,n);
    getch();
    }

Leave a comment