Hoán Vị: tìm và in ra các hoán vị trong lập trình c
#include "stdio.h"
#include "conio.h"
int a[100];
void tao(int n)//khởi tạo mảng ban đầu
{
for (int i = 1; i <= n; i++) a[i - 1] = i;
}
void xuat(int n)//xuất mảng
{
for (int i = 0; i < n; i++) printf("%d", a[i]);
printf("\n");
}
void doi(int &a, int &b)//hàm đổi chổ 2 số
{
int t = a;
a = b;
b = t;
}
void hoanvi(int n)//hàm in ra các hoán vị
{
int i, j, l, m;
xuat(n);//xuất ra cấu hình ban đầu
loop:;
for (i = n - 1; i >= 0; i--) if (a[i] > a[i - 1]) break;
/*tìm giá trị đầu tiên từ cuối cùng lên mà tại đó dãy số bắt đầu giảm dần
lấy đực giá trị của i thì kết thúc luôn vòng lặp*/
if (i > 0) for (j = n - 1; j >= i; j--) if (a[j] > a[i - 1])
/*nếu vị trí đó là vị trí đầu tiên thì coi như đã in xong các hoán vị*/
/*nếu không phải là vị trí đầu tiên tức là i>0 thì cho chạy vòng for
tìm trong các số cuối cùng tính từ vị tí i ta tìm ở trên, số đầu tiên trong các số đó
lớn hơn số hạng a[i-1], là số a[j] thì tiến hành các bước bên dưới:*/
{
doi(a[j], a[i - 1]);//đổi chổ 2 vị trí a[i-1] và a[j]
for (m = i; m < n - 1; m++) for (l = m + 1; l < n;l++)//
if (a[m]>a[l]) doi(a[l], a[m]); // sắp xếp các số cuối cùng tính từ vị trí i tăng dần
xuat(n);// sắp xếp xong thì in ra 1 hoán vị tìm được
break;//kết thúc vòng lặp nếu không nó sẽ làm tiếp gây ra sai kết quả
}
if (i != 0) goto loop;//nếu chưa in ra số hoán vị cuối cùng thì quay lên và tìm hoán vị tiếp theo
}
void main()
{
int n;
printf("nhập số số hạng cần tìm hoán vị, n=");
scanf_s("%d", &n);
tao(n);
hoanvi(n);
}
Created at 06/12/14,23:41:13
<< Bài Viết Khác
UNDER MAINTENANCE