Anh em lam ơn giải giùm mình 2 bài này với.
1.Xoa phan tu trung trong mang 1 chieu.
2.Xoa phan tu trung trong mang 2 chieu.
Cảm ơn trước nghen!!!
Anh em lam ơn giải giùm mình 2 bài này với.
1.Xoa phan tu trung trong mang 1 chieu.
2.Xoa phan tu trung trong mang 2 chieu.
Cảm ơn trước nghen!!!
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
if (a[i] == a[j] && i != j)
{
xoa (a, n, j);
j--;
}
}
return;
ham xoa thi ban biet roi chu? day la code xoa trung giu lai 1 phan tu. neu ban muon xoa het thi chi can thay doi chut it thoi. con mang 2 chieu cung tuong tu. rang suy nghi nha. neu khong duoc hay hoi tiep. tu ban suy nghi van la tot nhat. chuc lam duoc bai!
Thử bài này xem
Code:#include <iostream.h> #include <conio.h> #include <stdlib.h> void show(int *a,int n); void main() { clrscr(); int a[1000],n,i,j,k; n = 200; for(i=0;i<n;i++) { a[i] = random(50); } cout<<"\nMang vua nhap : "; show(a,n); i=0; //Đoạn xóa trùng lặp while(i<n-1) { for(j=i+1;j<n;j++) if(a[i]==a[j]) { //Xóa phần tử trùng lặp,giảm kích thước mảng đi 1 for(k=j;k<n;k++) a[k] = a[k+1]; n--; j--; } i++; } cout<<"Mang da xoa trung lap : "; show(a,n); getch(); } void show(int *a,int n) { int i; for(i=0;i<n;i++) cout<<a[i]<<" "; cout<<"\n"; }
Được sửa bởi tienthanh_tn lúc 21:45 ngày 07-03-2007
cảm ơn 2 bạn!! Nhưng đọc khó hiểu qué!!
Mình có viết đoạn code sau "de xóa phầu tử trùng mảng 1 chiều" như sau, nhưng chạy ko đúng.
void xoapttrung(int a[],int n)
{
for(int i=0;i<n;i++)
for(int j=i+1;i<n;j++)
if(a[i]==a[j])
{ j++;
a[j-1]=a[j];
n--;
printf("\n");
xuat(a,n);
}
}
Vd: em nhap
3 5 3 6 4
thì nó xóa đươc như vầy
3 5 6 6
Em ko hiểu nguyên nhân tại sao lại có thêm số 6 và lại mất đi số 4???Các huynh giải thích giùm em nhé!!
bạn làm như vậy thì khi i=2 ( ở vị trí số 3) a[2]=6, khi i nhảy lên vị trí tiếp theo thì vòng lặp kết thúc. Thực ra số 4 vẫn còn trong mảng, nhưng lúc này n=3 ( bạn gán n--) nên nó không được xuất ra màn hình.
Đây là bài của tui!
int n;
void xoa( int a[],int j)
{
for(int i=j;i<n-1;i++)a[i]=a[i+1];
n=n-1;
}
void xoaptchung(int a[])
{
int i=0,j;
while ( i<n) do //vòng lặp 1
{
j=0;
while (j<i) do //vòng lặp 2
{
if(a[j]==a[i])
{xoa(a,i);j=0;
}else
j++;
}
xuat(a[i]);
i++;
}
}
Tui lấy ví dụ với mảng 1,2,3,3,3,1,4,6
- i=0 : vòng lặp 2 không thực hiện, xuất số 1 và i=1.
- i=1 : vòng lặp 2 kiểm tra từ a[0] đến a[0], không thấy trùng nên thoát và xuất số 2, i=2.
- i=2 : tương tự trên.
- i=3 :Vòng lặp 2 thực hiện tới j=2 nên xóa a[3]=3, n=7,j=0
Vòng lặp chưa thoát mà tiếp tục thực hiện đến j=2 và xóa tiếp số 3, n=6, j=0
tiếp tục thực hiện lại vòng lặp 2 xóa tiếp số 1, n=5, j=0
lại vẫn thực hiện tiếp vòng lặp 2 nhưng lần này kiểm tra không thấy trùng => thoát và i=4
- i=4,5 :Như i=1.
Kết quả là 1,2,3,4,6....
Được sửa bởi nongdantangai lúc 14:32 ngày 07-03-2007
ờ......cảm ơn huynh nhé!!Code hơi khó hiểu...để ngâm coi có hiểu ko??
Theo mình nếu mảng có rất nhiều phần tử thì khi xoá mà lại gán các phần tử kiểu như vậy sẽ rất mất thời gian (xử lí lâu), vì vậy nên dùng các hàm memmove (memcpy) để chuyển copy mảng
làm vậy ko biet có đựoc ko?
a[] là mảng ban đâu
b[] se là mang chua các phần tử sau khi xóa
k=1;
b[0]=a[0];
For (i=1;i<n,i++)
{
j=0;
while (b[j]<>a[i] and j<>k)
{j++;}
if (b[j]<>a[k]) then
{
b[k]=a[i];
k++;
}
Mình cũng nghĩ là nên dùng hàm memcpy trong trương hợp thực tế nhưng ở đây đang nói về thuật toán => viết rõ một chút cho dễ hiểu.
Code:while(i<n-1) { for(j=i+1;j<n;j++) if(a[i]==a[j]) { //Xóa phần tử trùng lặp,giảm kích thước mảng đi 1 memcpy(&a[j],&a[j+1],(n-j)*sizeof(int)); n--; j--; } i++; }
thực ra các thuật toán trên chỉ sử dụng được với các mảng nhỏ, nếu mảng lên tới tỉ phần tử là máy chạy ì ạch ngay.
int i,j,a[max],b[max],c[max];
gán các pt c=0;j=0;
for(i=0;i<n;i++)
{
if ( c[a[i]]==0)
{
b[j]=a[i];
c[a[i]]=1;
j++;
}
}
b[] là mảng đã xóa các pt trùng,j là số pt của mảng b;
Bookmarks