Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: tìm chổ sai giùm tôi[liệt kê các hoán vị của n phần tử]

  1. #1
    Ngày gia nhập
    10 2008
    Bài viết
    0

    Wink tìm chổ sai giùm tôi[liệt kê các hoán vị của n phần tử]

    đây là bài toán liệt kê các hoán vi tập X gồm n phần tử
    ************************************************** ********
    C Code:
    1. #include "stdio.h"
    2. #include "conio.h"
    3. #include "math.h"
    4. double giaithua(int n)    //tính giai thừa của n
    5. {
    6.    int i;
    7.    double gt=1;
    8.    for(i=1;i<=n;i++) gt*=i;
    9.    return gt;
    10. }
    11. void doi(int *x,int *y)   //đổi giá trị của 2 biến cho nhau
    12. {
    13.    *x=*x^*y;
    14.    *y=*y^*x;
    15.    *x=*x^*y;
    16. }
    17. void main()
    18. {
    19.    int j,k,n,s[20],l;
    20.  
    21.    double i,c;
    22.    clrscr();
    23.    printf("\n liet ke cac hoan vi cua n=");scanf("%d",&n);//nhap n
    24.    printf("! la:\n\n");
    25.    for(i=1;i<=n;i++) {s[i]=i;printf("%d",s[i]);}
    26.    for(c=2;c<=giaithua(n);c++)
    27.    {
    28.       i=n-1;
    29.       while(s[i]>s[i+1]) i--;
    30.       j=n;
    31.       while(s[j]<s[i]) j--;
    32.       doi(&s[i],&s[j]);
    33.       for(k=i+1;k<=(n-i-1)/2;k++) doi(&s[k],&s[n+i+1-k]);
    34.       printf("\n");
    35.       for(k=1;k<=n;k++) printf("%d",s[k]);
    36.    }
    37.    getch();
    38. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 02-10-2008 lúc 04:13 PM.

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    - Đọc nội qui chưa vậy cậu ? Code không bỏ vào thẻ, lưu ý là topic không có câu hỏi là không có trả lời. Cậu đừng cho rằng topic là câu hỏi ? Cậu sai chỗ nào ? Compiler báo cái gì ?... ! Cậu hỏi mà cũng nhác thì người trả lời cũng chẳng phải siêng năng gì mà trả lời cho cậu !

  3. #3
    Ngày gia nhập
    10 2008
    Bài viết
    0

    xin lổi! tôi sẽ rút kinh nghiệm
    khi chương trình chạy thì nhập n=1 và n=2 thì kêt quả đúng
    nhưng khi nhập n>=3 thì chương trình chạy sai!
    mong bà con giúp đở

  4. #4
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Thuật toán của bạn ko chính xác, hơn nữa bạn ko nắm rõ là mảng trong C bắt đầu từ 0 chứ ko phải từ 1. Mình đã sửa cho bạn, chạy đúng với n=3. Nhưng mình thấy thuật toán này ko ổn lắm, bạn nên thay đổi thuật tóan khác đi.

    C Code:
    1. #include "stdio.h"
    2. #include "conio.h"
    3. #include "math.h"
    4.  
    5. long giaithua(int n)
    6. {
    7.     long gt = 1;
    8.  
    9.     for(int i=1;i<=n;i++)
    10.         gt *= i;
    11.  
    12.     return gt;
    13. }
    14.  
    15. void doi(int *x,int *y)  
    16. {
    17.     int tmp =(*x);
    18.     (*x) = (*y);
    19.     (*y) = tmp;
    20. }
    21.  
    22. void main()
    23. {
    24.     int j,k,n,s[20],l;
    25.     long i,c;
    26.  
    27.     clrscr();
    28.     printf("Liet ke cac hoan vi cua n = ");
    29.     scanf("%d",&n);
    30.     printf("! la:\n\n");
    31.  
    32.     for(i=1;i<=n;i++)
    33.     {
    34.         s[i-1] = i;
    35.         printf("%d",s[i-1]);
    36.     }
    37.  
    38.     long gt = giaithua(n);
    39.  
    40.     for(c=2;c<=gt;c++)
    41.     {
    42.         i = n - 2;
    43.         while(s[i] > s[i+1])
    44.             i--;
    45.  
    46.         j = n - 1 ;
    47.         while(s[j] < s[i])
    48.             j--;
    49.  
    50.         doi(&s[i],&s[j]);
    51.  
    52.         for(k=i+1;k<=(n-i-1)/2;k++)
    53.             doi(&s[k],&s[n+i-k]);
    54.  
    55.         printf("\n");
    56.  
    57.         for(k=0;k<n;k++)
    58.             printf("%d",s[k]);
    59.     }
    60.  
    61.     getch();
    62. }
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  5. #5
    Ngày gia nhập
    07 2008
    Bài viết
    30

    bạn nên dùng phương pháp đệ quy quay lui sẽ hay hơn
    Code:
    #include<stdio.h>
    #include<conio.h>
    void viet(int *b,int n)
    {       int i;
    	for(i=1;i<=n;i++)
    		printf("%d",b[i]);
    		printf("\n");
    }
    void try1(int *b,int n,int i,int *p)
    {       int j;
    	for(j=1;j<=n;j++)
    		if (p[j] == 1)
    		{
    			b[i]=j;
    			p[j]=0;
    			if (i==n) viet(b,n);
    			else try1(b,n,i+1,p);
    			p[j]=1;
    		}
    }
    void main()
    {
    	int b[10],n,i,p[10];
    	clrscr();
    	printf("nhap n");
    	scanf("%d",&n);
    	for(i=1;i<=n;i++)
    		p[i]=1;
    	try1(b,n,1,p);
    getch();
    }

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

  1. Đề xuất Tôi vi phạm nội quy, Admin xử lý giùm!
    Gửi bởi Xcross87 trong diễn đàn Ý kiến, đề xuất và khiếu nại
    Trả lời: 9
    Bài viết cuối: 26-09-2011, 10:12 PM
  2. Sửa giùm bài và sửa sai phần tìm tên nhân viên
    Gửi bởi laobao trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 11-12-2010, 07:31 AM
  3. Sữa Giùm Mình Phần Uscln Sai Chỗ Nào
    Gửi bởi quangdat110189 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 14
    Bài viết cuối: 10-04-2008, 01:17 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