21/8/10

xóa phần tử trùng nhau trong mảng, chỉ giữ lại mổi phần tử trùng nhau duy nhất một lần

Đây là chương trình mảng: xóa tất cả các phần tử trùng nhau trong mảng chỉ để lại mổi phần tử trùng nhau lại duy nhất một lần. Bài này mình đã suy ngẫm rất nhiều và cũng bỏ ra không ít thời gian. Khi đi thuyết trình mình đã được 9đ với bài này. chương trình được viết bằng borlandc 3.1:

#include<stdio.h>
#include<conio.h>
void main()
{
     int a[100],i,j,k,n;//khai báo
     clrscr();//xóa màn hình
     printf("\nBan hay nhap do lon cua mang:\n");
     scanf("%d",&n);
     printf("Bat dau nhap mang:\n");
     for(i=0;i<n;i++)
     {
         printf("Nhap a[%d] = ",i);
         scanf("%d",&a[i]);
     }
    printf("Mang sau khi sua lai la:\n");
    for (i=0;i<n-1;i++)
    {
       for(j=i+1;j<n;j++)
       {
           if(a[i]==a[j])//trường hợp a[i]=a[j]
           {
                for( ;j<n;j++)
                       a[j]=a[j+1];//lặp gán phần tử a[i] bằng phần tử
                                           kế tiếp a[i+1]

                 n--;//xóa phần tử trống cuối cùng sau khi lặp ở trên
                 j--;//giảm j để xét tiếp vị trí sau khi gán đã được
                        dịch chuyển lên trước nó
                 i--;//tương tự trên
           }
       }


    }
for(i=0;i<n;i++)
printf(" %d ",a[i]);

getch();
}//main finish


Bài này cũng có một giải thuật khác là các bạn lấy từng phần tử trong mảng a[100] đưa sang mảng B[100] khác rồi kiểm tra xem các phần tử trong mảng b[100] đã có trong mảng a[100] chưa. Nếu chưa có thì lấy sang mảng b. Ngược lại thì kệ bà nó, khỏi cần lấy. Cuối cùng thì gán mảng b ngược lại mảng a rồi xuất nó ra là ổn thôi.

enjoy!
Có gì không hiểu thì pm lại cho mình nhé mình giải thích lại cho.

2 nhận xét:

  1. for( ;j<n;j++)
    cho nay dieu kien dau tien cua j la sao vay a

    Trả lờiXóa
  2. ban oi,giai thich cho minhf thuat toan cua ban duoc ko

    Trả lờiXóa

thanks các bạn vì đã đóng góp ý kiến!