[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');
}
|