Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 20 kết quả

Đề tài: Từ một dãy tăng tạo thành dãy tăng thực sự?

  1. #1
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Mặc định Từ một dãy tăng tạo thành dãy tăng thực sự?

    Mình có một bài thế này:
    Cho một dãy số tăng (giảm), xét tất cả các số, nếu có các phần tử bằng nhau thì giữ lại 1 trong số các số đó ==> dãy tăng (giảm) thực sự.
    Vd: 1, 2, 3, 4, 4, 6, 7, 7 ==> 1, 2, 3, 4, 6, 7.
    Mở rộng cho dãy không tăng, không giảm nếu có các phần tử bằng nhau thì giữ lại 1 trong số các số đó.
    VD: 1, 34, 23, 23, 2, 4, 6, 6, 6, 5 ==> 1, 34, 23, 2, 4, 6 5.
    Mong các bạn giúp cho. Nếu các ban làm được trên máy vui lòng post lên đoạn chương trình chính (nếu cả chương trinh thì tốt hơn), hoặc ý tưởng thuật toán cũng được.
    Lưu ý số phần tử của dãy và các phần tử dãy không cố định. (Mình mới chỉ học C thôi chưa học C++)

    Không post các câu hỏi vào box hướng dẫn. zkday.
    Mong admin chuyển chủ đề này về đúng vị trí.
    Đã được chỉnh sửa lần cuối bởi trungkien45 : 24-03-2009 lúc 01:51 PM.

  2. #2
    Ngày gia nhập
    01 2009
    Bài viết
    165

    Bạn tạo thêm 1 mảng b;chọn phần tử đầu tiên của mảng đã cho bỏ vào mảng b;sau đó xét tất cả các phần tử của mảng đã cho,nếu phần tử nào khác với tất cả các phần tử đã có trong mảng b thì bỏ vào mảng b.Mảng b chính là dãy tăng thực sự.

  3. #3
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Trên là một cách khá dễ hình dung rồi, ngoài ra bạn có thể dùng 2 vòng lặp:

    - Vòng một duyện từ giá trị thứ 2 đến cuối (nên dùng while) bằng i

    - Vòng 2 duyểt từ đầu đế i-1 bằng j, so sánh giá trị tại i và j nếu bằng nhau thì del i (viết hàm del) trái lại tăng i lên.

    Have fun!

  4. #4
    Ngày gia nhập
    03 2009
    Bài viết
    45

    Mình có dùng cả 2 loại vòng lặp đây:
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    void main()
    {
    int n,i,j; float a[100],u,b[100];
    clrscr();
    printf("\n Nhap n=");scanf("%d%*c",&n);
    for (i=1;i<=n;i++) {
    		   printf("\n a[%d]=",i);scanf("%f%*c",&a[i]);
    		   }
    /*i=1;
    while (i<n) {
    	    j=2;
    	    while (j<=n) {
    			if (a[i]>a[j]) {
    				       u=a[j];
    				       a[j]=a[i];
    				       a[i]=u;
    				       }
    			j=j++;
    			}
    	    i=i++;
    	    }*/
    for (i=1;i<n;i++)
    		 for (j=i;j<=n;j++) {
    				    if (a[i]>a[j]) {
    						   u=a[j];
    						   a[j]=a[i];
    						   a[i]=u;
    						   }
    				     }
    for (i=1;i<=n;i++) printf("\n a[%d]=%f",i,a[i]);
    b[1]=a[1];j=1;
    for (i=2;i<=n;i++) 
                            {
                             if (a[i]<>b[j]) {j=j++;b[j]=a[i]);}
                             }
    for (i=1;i<=j;i++) printf("\n b[%d]=%f",i,b[i]);
    getch();
    }
    Đã được chỉnh sửa lần cuối bởi Mingyu : 26-03-2009 lúc 10:59 PM.

  5. #5
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    @Mingyu: Làm gì vậy bạn, đã đọc hết đầu bài chưa. Đâu phải bài sort mảng.

    Đây có một cách nữa này, tuy nhiên nó làm thay đổi vị trí tương đối các phần tử mảng:
    C Code:
    1. /*Xoa cac phan tu trung nhau - lam thay doi thu tu mang*/
    2. void DeleteValue(float fArray[], int *num)
    3. {
    4.     int t=*num-1,i=1;
    5.     while (i<=t)
    6.     {
    7.         int j, k=t;
    8.         for (j=0; j<i; j++)
    9.             if (fArray[j]==fArray[i])
    10.             {
    11.                 fArray[i] = fArray[t]; //Chỗ này mà thay bằng hàm del thì như cách trên H nói
    12.                 t--;
    13.                 break;
    14.             }
    15.         if (k==t) i++;
    16.     }
    17.     *num = t+1;
    18. }

  6. #6
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Mặc định Từ một dãy tăng tạo thành dãy tăng thực sự?

    Mình vừa mới học hàm, chưa biết nhiều lắm. Bài toán 1 đã làm được rồi. Còn bài toán mở rộng chưa làm được. Đúng như QuangHoang nói, bài toán mở rộng không phải bài sắp xếp. Mong mọi người hiểu. Nếu có thể xin viết cả hàm chính ( main ) đưa lên và chạy thử xem.

  7. #7
    Ngày gia nhập
    01 2009
    Bài viết
    165

    Cách của mình có thể áp dụng cho cả bài 1 và bài mở rộng ,và không hề làm thay đổi vị trí tương đối giữa các phần tử trong mảng ban đầu.Xem ra đây là cách tốt nhất (cho đến lúc này).
    Đã được chỉnh sửa lần cuối bởi kimduquan : 25-03-2009 lúc 09:01 AM.

  8. #8
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Mình đã làm được. Đầu tiên kiểm tra các phần tử của a[n], dùng hai vòng for lông nhau, nếu a[i]==a[j] và i<j thì gán giá trị a[j]= 1 ptử m nào đó không có trong mảng, cụ thể mình lấy giá trị lớn hơn max a[n] rồi in ra các ptử giá trị nhỏ hơn giá trị đó (m). hoặc có thể gán vào mảng khác và dùng như trên, nhưng mình thực hiện thấy nó hay in thiếu, Mong mọi người giải quyết. Đây không phải là bài tập. mà là một bài toán do mình đọc trong sách.
    Đã được chỉnh sửa lần cuối bởi trungkien45 : 25-03-2009 lúc 11:07 PM.

  9. #9
    Ngày gia nhập
    03 2009
    Bài viết
    45

    Nếu bạn ko cần sỏt mảng thì bạn chỉ cần bỏ qua nó thôi, 5 dòng cuối chương trình của mình đã đáp ứng cả 2 bài rùi mà

  10. #10
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Mặc định Re:Từ một dãy tăng tạo thành dãy tăng thực sự?

    Trích dẫn Nguyên bản được gửi bởi Mingyu Xem bài viết
    Nếu bạn ko cần sỏt mảng thì bạn chỉ cần bỏ qua nó thôi, 5 dòng cuối chương trình của mình đã đáp ứng cả 2 bài rùi mà
    5 dòng cuối của bạn, minh test từ khi đọc trả lời của kimduquan rồi. Nó chỉ hiệu quả cho bài dãy tăng thôi còn bài mở rộng thì không được, vì nó chỉ xét các ptử kề nhau thôi. còn một cách nữa nhưng cũng phải dùng 2 vòng for lồng nhau, 1 trong 2 vong for sẽ phải thay đổi điều kiện dừng:
    Code:
    b[0]=a[0];k=1;
    for(i=1;i<n;i++)
    for(j=0;j<k;j++)
    if(a[i]!=b[j])
    {
    b[j]=a[i];
    k++;
    }
    Thì mới xét hết các phần tử mảng b, sơ sơ vậy thôi.
    Đã được chỉnh sửa lần cuối bởi trungkien45 : 26-03-2009 lúc 02:17 PM. Lý do: Code không logic cần sửa lại.

Các đề tài tương tự

  1. Dịch vụ tăng like facebook và tăng vote google +1
    Gửi bởi raovatgirevn trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 07-05-2012, 11:26 AM
  2. Thuật toán chuyển dãy tăng giảm thành dãy tăng?
    Gửi bởi anhtran trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 5
    Bài viết cuối: 12-03-2012, 07:40 AM
  3. help!! chèn 1 số vào mảng tăng khồng làm thay đổi tính tăng bằng danh sách liên kết đơn....
    Gửi bởi nobita_1992 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 20-11-2011, 09:03 PM
  4. sắp xếp mảng số nguyên chẵn tăng dần, lẻ tăng dần, không dùng mảng tạm
    Gửi bởi hailoc12 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 09-08-2006, 11:44 AM

Quyền hạn của bạn

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