[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)); }
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?
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
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();
}
/*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();
}