2013年10月4日 星期五

[C/C++ 演算法]- m 元素清單的 n 元素子清單

[C/C++ 演算法]- m 元素清單的 n 元素子清單



剛才找資料時發現一個C/C++的教學網站,趕快發揮(C/P)的長才將它備份來,有需要的同好,歡迎來(C/P)一下^^。


拷貝來源:
http://openhome.cc/Gossip/AlgorithmGossip/
http://openhome.cc/Gossip/AlgorithmGossip/NOfM.htm









#include <stdio.h> 
#include <stdlib.h>

#define MAX 20

void
init(int*, int);
int
position(int*, int, int);
void
next(int*, int, int);
void
print(int*, int);

int
main(void) {
int
list[MAX] = {0};
int
m, n;

printf("清單個數 m:");
scanf("%d", &m);
printf("取出個數 n:");
scanf("%d", &n);

init(list, n);
print(list, n);
while
(hasNext(list, m, n)) {
next(list, m, n);
print(list, n);
}


return
0;
}


void
init(int* list, int n) {
int
i;
for
(i = 0; i < n; i++) { list[i] = i + 1; }
}


int
position(int* list, int m, int n) {
if
(list[n - 1] != m) {
return
n - 1;
}

else
{
int
pos = n - 2;
while
(list[pos + 1] - list[pos] == 1) { pos--; }
return
pos;
}
}


int
hasNext(int* list, int m, int n) {
return
list[0] < m - n + 1;
}


void
next(int* list, int m, int n) {
int
pos = position(list, m, n);
list[pos]++;
int
i;
for
(i = pos + 1; i < n; i++) { list[i] = list[i - 1] + 1; }
}


void
print(int* list, int n) {
int
i;
for
(i = 0; i < n; i++) { printf("%d ", list[i]); }
putchar('\n');
}


 


 


沒有留言:

張貼留言