好多天连不上我的Blog了,很郁闷,今天终于连上一次,看到有人要我把用不重复的数字构建和式的程序贴出来,翻了一下箱底,找到了。把它贴出来吧,好久了,有的地方都记不清了。可能有错误,请多多指教。
#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK 128
int addends[MAX_STACK] = {0};
int sp = 0;
int used[MAX_STACK] = {0};
int get_sum(int sum, int maxAddend) {
int i = 0;
int start = min(maxAddend, sum);
int ret = 0;
if (sum == 0) {
for (i=sp-1; i>0; --i)
printf("%d+", addends[i]);
printf("%d/n", addends[0]);
ret = 1;
} else {
for (i=start; i>0; --i) {
if (used[i]) continue;
addends[sp++] = i;
used[i] = 1;
if (! get_sum(sum-i, maxAddend) ) {
sp = 0;
return 0;
}
--sp;
ret = 1;
}
}
return ret;
}
int main(int argc, char *argv[]) {
int m,n,i;
if (argc != 3) {
printf("Input the sum (m) and the max addend (n), with space seperated:");
scanf("%d%d", &m, &n);
} else {
m = atoi(argv[1]);
n = atoi(argv[2]);
}
if (m <=0 || n<=0 || m >= MAX_STACK || n>=MAX_STACK) return 1;
for (; n>0; --n) {
for (i=0; i<MAX_STACK; ++i)
used[i]=0;
get_sum(m, n);
}
system("pause");
return 0;
}
其实就是把以前的那个程序加上了一个全局的“是否已用”的标志而已。
85

被折叠的 条评论
为什么被折叠?



