Hiển thị kết quả từ 1 đến 10 / 10

Chủ đề: 2 bài nhức đầu

  1. #1
    Tham gia
    11-12-2006
    Bài viết
    52
    Like
    0
    Thanked 0 Times in 0 Posts

    Ngạc nhiên 2 bài nhức đầu

    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!!!
    Quote Quote

  2. #2
    Tham gia
    06-03-2007
    Bài viết
    124
    Like
    0
    Thanked 0 Times in 0 Posts
    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!

  3. #3
    Tham gia
    26-04-2005
    Bài viết
    393
    Like
    0
    Thanked 2 Times in 2 Posts
    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

  4. #4
    Tham gia
    11-12-2006
    Bài viết
    52
    Like
    0
    Thanked 0 Times in 0 Posts
    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é!!

  5. #5
    Tham gia
    27-02-2007
    Bài viết
    96
    Like
    0
    Thanked 0 Times in 0 Posts
    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

  6. #6
    Tham gia
    11-12-2006
    Bài viết
    52
    Like
    0
    Thanked 0 Times in 0 Posts
    ờ......cảm ơn huynh nhé!!Code hơi khó hiểu...để ngâm coi có hiểu ko??

  7. #7
    Tham gia
    07-04-2004
    Bài viết
    484
    Like
    0
    Thanked 0 Times in 0 Posts
    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

  8. #8
    Tham gia
    19-11-2006
    Bài viết
    140
    Like
    0
    Thanked 1 Time in 1 Post
    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++;
    }

  9. #9
    Tham gia
    26-04-2005
    Bài viết
    393
    Like
    0
    Thanked 2 Times in 2 Posts
    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++;
    	}

  10. #10
    Tham gia
    27-02-2007
    Bài viết
    96
    Like
    0
    Thanked 0 Times in 0 Posts
    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

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •