一道c语言的题目。请高手们帮帮忙

从1到33这些数中任选6个不相等的数,这6个数的和大于等于60且小于等于137,这6个数的个位数相加大于等于14且小于等于36,这6个数中相邻连续的各数不超过3个,这样的组合有多少种,并输出组合。

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdio.h>

typedef struct args {
int nums[6];
int count;
int continuous;
}Args;

void getNewNumber(Args *args) {
int i, j;
if (args->count == 5) {
int all = 0;
int _all = 0;
for(i = 0; i < 6; i++) {
all += args->nums[i];
_all += (args->nums[i] % 10);
}
if(all < 60 || all > 137 || _all < 35 || _all > 36)
return;

for (i = 0; i < 6; i++) {
printf("%d ", args->nums[i]);
}
printf("\n");
return;
}
i = (args->continuous == 2) ? args->nums[args->count] + 2 : args->nums[args->count] + 1;
if (i > 33)
return;

for (j = i; j <= 33; j++) {
Args n;
memcpy(&n, args, sizeof(n));
if (j == n.nums[n.count] + 1) {
n.continuous++;
n.count++;
n.nums[n.count] = j;
getNewNumber(&n);
} else {
n.count++;
n.nums[n.count] = j;
getNewNumber(&n);
}
}
}

void main()
{
int i = 1;
Args *root = (Args *) malloc (sizeof(Args));
memset(root, 0, sizeof(Args));

for (i = 1; i <= 33; i++) {
root->continuous = 0;
root->count = 0;
root->nums[0] = i;
getNewNumber(root);
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-02-15
最原始的方法就是就是设置六个变量循环
(for i=1;i<=33;i++)
(for j=i+1;j<=33;j++)
……

询环内部进行判断,符合条件就输出,否则continue
不过貌似运算量很大啊,有什么高级点的算法我暂时没想到
相似回答
大家正在搜