Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: [ Solved ]Số chẵn nằm trước, số 0 nằm giữa (nếu có), số lẻ nằm phía sau

  1. #1
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    27

    Angry [ Solved ]Số chẵn nằm trước, số 0 nằm giữa (nếu có), số lẻ nằm phía sau

    Chào tất cả các bạn! Sory vì đã làm phiền các bạn vào dịp hè này nha
    Đây là bài mình đã thắc mắc và suy nghĩ rất lâu. Mà ko thể có được cách giải đúng . Theo các bạn : Các bạn giải thế nào, mình mong sự góp ý từ các bạn nhiều.
    Đề : Nhập n phần tử cho mảng. Xuất mảng sao cho Số chẵn nằm trước, số 0 nằm giữa (nếu có), số lẻ nằm phía sau
    Sự góp ý của các bạn là bước đầu cho mình hình thành code. Cám ơn rất nhiều
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    10 2007
    Nơi ở
    TP. HCM
    Bài viết
    52

    Duyệt mảng lần 1 từ trái sang phải sắp xếp số lẻ xuống cuối mảng, các số còn lại lên đầu mảng.

    Duyệt mảng lần 2 từ phải qua trái sắp xếp đổi chổ các số chẳn đầu tiên và các số 0.
    /* The thing that I think is the thing that I do. */

  3. #3
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    27

    Trước tiên, cám ơn bạn đã góp ý cho mình.
    bạn có thể chi tiết hơn, việc "sắp xếp số lẻ xuống cuối mảng, số còn lại lên đầu" ko ?
    Còn việc thứ 2, nếu trường hợp ko có số 0 nào. Sao mà đổi ?

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

    Trước mình làm một lần rồi nhưng chẳng biết quẳng đi đâu rồi, nay mình làm lại một code demo cho ban:
    Code:
    //Chuyen so chan (khac 0) len dau, khong o giua le o cuoi.
    #include <stdio.h>
    
    void chuyen(int a[],int n);
    
    int main()
    {
         int n=9,a[9]={1,0,3,3,4,2,5,0,7};
         int i;
         chuyen(a,n);
         for (i=0;i<n;i++)
              printf("%4d",a[i]);
    }
    
    void chuyen(int a[],int n)
    {
         int i,t1=0,t2=n-1;
         for (i=t1;i<t2;i++)                     //su ly chan le
         {
              while (a[t1]%2==0)t1++;
              while (a[t2]%2==1)t2--;
              if (a[i]%2==1)
              {
                   int b=a[i];
                   a[i]=a[t2];
                   a[t2]=b;
                   t2--;
              }
         }
         t2=t1+1;t1=0;
          for (i=t1;i<t2;i++)                   //su ly chan va so 0
         {
              while (a[t1]!=0)t1++;
              while (a[t2]==0)t2--;
              if (a[i]==0)
              {
                   int b=a[i];
                   a[i]=a[t2];
                   a[t2]=b;
                   t2--;
              }
         }
    }

  5. #5
    Ngày gia nhập
    10 2007
    Nơi ở
    TP. HCM
    Bài viết
    52

    Trích dẫn Nguyên bản được gửi bởi Trương Phan Bình Xem bài viết
    Trước tiên, cám ơn bạn đã góp ý cho mình.
    bạn có thể chi tiết hơn, việc "sắp xếp số lẻ xuống cuối mảng, số còn lại lên đầu" ko ?
    Còn việc thứ 2, nếu trường hợp ko có số 0 nào. Sao mà đổi ?
    Tất cả tóm gọn trong hàm này:
    C Code:
    1. void sapxep(int a[], int N)
    2. {
    3.     int i, j, t;
    4.  
    5.     /* sap xep so le xuong cuoi mang */
    6.     for (i = 0; i < N - 1; i++) {
    7.         for (j = i + 1; j < N; j++)
    8.             if (a[i] % 2 != 0 && a[j] % 2 == 0) {
    9.                 t = a[i]; a[i] = a[j]; a[j] = t;
    10.                 break;
    11.             }
    12.     }
    13.  
    14.     /* sap xep doi cho so 0 ra giua so chan va le */
    15.     for (i = N - 1; i > 0; i--) {
    16.         for (j = i - 1; j > -1; j--)
    17.             if (a[i] % 2 == 0 && a[j] == 0) {
    18.                 t = a[i]; a[i] = a[j]; a[j] = t;
    19.                 break;
    20.             }
    21.     }
    22. }
    Đã được chỉnh sửa lần cuối bởi Chautieu47 : 31-07-2008 lúc 07:58 PM.
    /* The thing that I think is the thing that I do. */

  6. #6
    Ngày gia nhập
    04 2008
    Nơi ở
    Phu yen
    Bài viết
    10

    Mặc định [ Solved ]Số chẵn nằm trước, số 0 nằm giữa (nếu có), số lẻ nằm phía sau

    Trích dẫn Nguyên bản được gửi bởi Chautieu47 Xem bài viết
    Tất cả tóm gọn trong hàm này:
    C Code:
    1. void sapxep(int a[], int N)
    2. {
    3.     int i, j, t;
    4.    
    5.     /* sap xep so le xuong cuoi mang */
    6.     for (i = 0; i < N - 1; i++) {
    7.         for (j = i + 1; j < N; j++)
    8.             if (a[i] % 2 != 0 && a[j] % 2 == 0) {
    9.                 t = a[i]; a[i] = a[j]; a[j] = t;
    10.             }
    11.     }
    12.  
    13.     /* sap xep doi cho so 0 ra giua so chan va le */
    14.     for (i = N - 1; i > 0; i--) {
    15.         for (j = i - 1; j > -1; j--)
    16.             if (a[i] % 2 == 0 && a[j] == 0) {
    17.                 t = a[i]; a[i] = a[j]; a[j] = t;
    18.             }
    19.     }
    20. }


    Theo mình nghĩ ko nên tách biệt sắp sếp số lẻ và số chẳn thành 2 đoạn mà làm chung.
    Hướng giải thế này:

    b1: khai báo các biến n,i=0,j=n //n:số phần tử thực sự của mảng
    b2: while(i<j){
    b3: for(i=0;i<=n;i++) if(a[i] chẳn) break;
    b4: for(j=n;j>=0;j--) if(a[j] lẻ) { hoán đổi a[i] và a[j]; break;}
    b5: i++; j--;
    }

    sau khi hoán đổi xong lúc này nếu có số 0 thì nó được tính là chẳn và i là phẩn tử cuối chẳn j là phần tử đầu của phần lẻ .

    b6: for(int k=0;k<=i;k++)
    b7: if(a[k]==0) {hoán đổi a[k] và a[i]; i--;}

    vậy là xong.
    có gì thắc mắc bạn cho ý kiến.
    Mình chưa kiển tra lại nhưng hi vọng là đúng. Mong nhận lại hồi âm .

  7. #7
    Ngày gia nhập
    10 2007
    Nơi ở
    TP. HCM
    Bài viết
    52

    Bạn chưa đọc kỹ bài của tui rồi. Vòng for đầu tiên tui sắp xếp số lẻ xuống cuối mảng, các số còn lại bao gồm số chẵn và các số 0 (nếu có) lên đầu mảng. Như vậy ở vòng for này các số chẵn và số lẻ đã được dồn lên đầu và cuối mảng cùng lúc rồi.

    Ở vòng for thứ 2 là để đổi chổ các số chẵn đầu tiên (tính từ phải qua trái) với các số 0 (nếu có). Trường hợp không có số 0 nào thì không đổi chổ thôi.

    À ở đây tui làm dựa theo giải thuật sắp xếp tăng giảm. Để giảm bớt các phép tính nên để lệnh break; sau mổi lần đổi chổ, cái này là thiết sót của tui đã sửa lại trên kia rồi.
    /* The thing that I think is the thing that I do. */

  8. #8
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Tại sao cứ phải cứng nhắc làm trên 1 mảng, sao ko dùng 1 mảng phụ?

  9. #9
    Ngày gia nhập
    08 2008
    Bài viết
    22

    Tổng hợp nè
    C++ Code:
    1. /*
    2. http://forums.congdongcviet.com/showthread.php?t=8789
    3. */
    4.  
    5. #include <iostream>
    6. #include <cstdlib>
    7.  
    8. using namespace std;
    9.  
    10. //////////////////////////////////////////////////////////////////////////////////////
    11. const int MAX_N = 10000;
    12.  
    13. int N, A[MAX_N];
    14. ///////////////////////////////////////////
    15. void ReadData(){
    16.     cout << "N = ";
    17.     cin  >> N;
    18.     for (int i=1; i<=N; i++){
    19.         cout <<"A[" <<i <<"] = ";
    20.         cin  >>A[i];
    21.     }
    22. }
    23. ///////////////////////////////////////////
    24. template<class T> void Swap(T& x, T& y){
    25.     T z;
    26.     z = x; x = y; y = z;
    27. }
    28. ///////////////////////////////////////////
    29. int Order(int x){
    30.     if (x%2 == 1) return 1;
    31.     if (x == 0) return 0;
    32.     return -1;
    33. }
    34. ///////////////////////////////////////////
    35. // Sort -bruteforce :D
    36. void Solution_1(){
    37.     for (int i = 1; i<N; i++)
    38.         for (int j = i+1; j<=N; j++)
    39.             if (Order(A[i]) < Order(A[j])) Swap(A[i], A[j]);
    40. }
    41. ///////////////////////////////////////////
    42. // Dual array =))
    43. void Solution_2(){
    44.     int* B = new int[N];
    45.     memcpy(B, A+1, N*sizeof(int));
    46.    
    47.     int l = 1, r =N;
    48.     for (int i = 0; i<N; i++)
    49.         if (Order(B[i]) < 0)    A[l++] = B[i];
    50.         else
    51.             if (Order(B[i]) > 0)    A[r--] = B[i];     
    52.    
    53.     if (l<=r) memset(A+l, 0, (r-l+1)*sizeof(int));
    54.  
    55.     delete[] B;
    56. }
    57. ///////////////////////////////////////////
    58. void Solution_3(){
    59.     int l = 1, r = N;
    60.     A[0] = 0;
    61.     A[N+1] = 1;
    62.     do{
    63.         while (A[l]%2 == 0) l++;
    64.         while (A[r]%2 != 0) r--;
    65.         if (l<r)    Swap(A[l++], A[r--]);      
    66.     }while(l<r);
    67.  
    68.     l = 1;
    69.     A[0] = 1;
    70.     A[N+1] = 0;
    71.     while (l<r){
    72.         while (A[l] != 0) l++;
    73.         while (A[r] == 0) r--;
    74.         if (l<r) Swap(A[l++], A[r--]);
    75.     }
    76. }
    77. ///////////////////////////////////////////
    78. void WriteData(){
    79.     cout <<"Result: ";
    80.     for (int i = 1; i<=N; i++)
    81.         cout <<A[i] <<" ";
    82.     cout <<endl;
    83. }
    84. //////////////////////////////////////////////////////////////////////////////////////
    85. int main(){
    86.     ReadData();
    87.     Solution_1();
    88.     WriteData();
    89.    
    90.     system("pause");
    91.     return EXIT_SUCCESS;
    92. }
    93. //////////////////////////////////////////////////////////////////////////////////////

  10. #10
    Ngày gia nhập
    07 2008
    Nơi ở
    HCM
    Bài viết
    13

    oh! xin cám ơn bài viết của bác!
    Sorry vì đã để topic này khá lâu, do em bận tí việc.
    Em xin post code của mình lên, cộng thêm vấn đề in ra số nguyên tố nhỏ hơn x
    C++ Code:
    1. #include <math.h>
    2. #include <conio.h>
    3. #include <iostream.h>
    4. void Nhap(int a[], int &n)
    5. {
    6.     cout<<"\nNhap phan tu cua mang: ";
    7.     cin>>n;
    8.     for(int i=1;i<=n;i++)
    9.     {
    10.       cout<<"a["<<i<<"]= ";
    11.       cin>>a[i];
    12.     }
    13. }
    14. void Xuat(int a[], int n)
    15. {
    16.     cout<<"Mang vua nhap: ";
    17.     for(int i=1;i<=n;i++)
    18.     {
    19.       cout<<" "<<a[i];
    20.     }
    21. }
    22.  
    23. void Sort(int a[], int n)
    24. {
    25.     int b,c,d,e,t,t2;
    26.     for(b=0;b<=n-1;b++)
    27.     {
    28.       for(c=b+1;c<=n;c++)
    29.       {
    30.      if ((a[b]%2!=0) && (a[c]%2==0))
    31.      {
    32.         t=a[b];
    33.         a[b]=a[c];
    34.         a[c]=t;
    35.      }
    36.       }
    37.     }
    38.     for (d=n-1;d>=1;d--)
    39.     {
    40.       for(e=d-1;e>=0;e--)
    41.       {
    42.      if ((a[d]%2==0) && (a[e]==0))
    43.      {
    44.         t2=a[e];
    45.         a[e]=a[d];
    46.         a[d]=t2;
    47.      }
    48.       }
    49.     }
    50. }
    51.  
    52. int Ktra_NT(int a)
    53. {
    54.   int kq=1;
    55.   if(a==2||a==3)
    56.  
    57.     return 1;
    58.  
    59.   else
    60.   {
    61.     if (a==0)
    62.        return 0;
    63.     else
    64.     {
    65.        for(int i=2;i<=sqrt(a);i++)
    66.        {
    67.             if (a%i==0)
    68.               return 0;
    69.         }
    70.        
    71.     }
    72.   }
    73.   return 1;
    74. }
    75.  
    76. void main()
    77. {
    78.   int a[100],n,x;char c;
    79.   do
    80.   {
    81.   //clrscr();
    82.   Nhap(a,n);
    83.   Sort(a,n);
    84.   Xuat(a,n);
    85.   cout<<"\nNhap x: ";cin>>x;
    86.   for(int i=0;i<=n-1;i++)
    87.   {
    88.     if ( (a[i]<x) && Ktra_NT(a[i])==1)
    89.     {
    90.         cout<<" "<<a[i];
    91.     }
    92.   }
    93.   cout<<"\nBan co muon lam lai ko ? (C/K) ";cin>>c;
    94.   }while(c=='c'||c=='C');
    95.  
    96. }

    Tuy nhiên, em cũng xin cám ơn lời góp ý của bác huy_nguyen, em sẽ nghiên cứu vấn đề dùng mảng phụ (đây là 1 phương pháp hữu dụng ), em sẽ cố gắng hoàn thành sớm post lên cho mọi người.
    Một lần nữa, xin cám ơn mọi người.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

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

  1. Cách tạo ma phương chẵn?
    Gửi bởi dehin trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 22-12-2012, 02:32 PM
  2. Bài tập C in ra tổng của chữ số chẵn
    Gửi bởi maptdt trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 13-12-2011, 06:50 PM
  3. Bài tập C số chẵn số lẻ
    Gửi bởi trungthienckc trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 28-10-2011, 12:10 AM
  4. Mảng trên C++ tìm tổng chẵn, lẻ của mảng
    Gửi bởi jimhawkins trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 13-10-2011, 08:42 PM
  5. Kiểm tra tính chẵn lẻ của một số
    Gửi bởi NT_OnlyLove trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 12
    Bài viết cuối: 22-01-2008, 08:50 PM

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