编程输出从1,2,3,4,5,6中任选3个数组成的所有组合

2024-12-04 19:02:26
推荐回答(4个)
回答1:

#include
#include
#include
// 计算 n!
int fact(int n)
{
long f;
if (n ==0 || n == 1)
{
return 1;
}
else
{
return fact(n-1)*n;
}
}
// 计算组合数 C(m,n)
int cmn(int m,int n)
{
if(m>n)
{
return 0;
}
else
{
return fact(n)/fact(m)/fact(n-m);
}
}

void permutationAndCombination
(
// 基本参数
int data[],int dataSize,int selectNum,
// 递归用到的参数
int start,int flag[],int count,
// 选择排列的结果
int ***result ,int *resultSize
)
{
int i;
int totalSelectMethods = cmn(selectNum,dataSize);

if(flag == NULL || (*result) == NULL)
{
flag = (int*)malloc(sizeof(int)*dataSize);
memset(flag,0,sizeof(int)*dataSize);

(*result) = (int**)malloc(sizeof(int*)*totalSelectMethods);
for(i=0;i {
(*result)[i] = (int*)malloc(sizeof(int)*selectNum);
}
*resultSize = 0;
}

if(selectNum == count)
{
(*resultSize) ++;
if((*resultSize) < totalSelectMethods)
{
for(i=0;i {
(*result)[*resultSize][i] = (*result)[(*resultSize)-1][i];
}
}
}
else
{
// 注意终止条件: (dataSize - i) >= (selectNum - count)
for(i = start;(dataSize - i) >= (selectNum - count);i++)
{
if(flag[i] == 0)
{
(*result)[*resultSize][count] = data[i];
flag[i] = 1;
permutationAndCombination
(
data,dataSize,selectNum,
i+1,flag,count+1,
result,resultSize
);
flag[i] = 0;
}
}
}
}
int main(int argc, char *argv[])
{
/*
从数组 data(不含重复元素)中取 selectNum 个数字的方案。
只要修改 data 和 selectNum,其他地方不用修改,就能计算任意的排列组合问题。
比如:
int data[]={1,2,3,4,5,6,7,8};
int selectNum = 5;
表示从1-8中取5个数字的方案。

*/
int data[]={1,2,3,4,5,6,7};
int selectNum = 3;

int **result = NULL,resultSize = 0;
int i,j;

permutationAndCombination
(
data,sizeof(data)/sizeof(data[0]),selectNum,
0,NULL,0,
&result,&resultSize
);

for(i=0;i {
printf("第%3d种方案:",i+1);
for(j=0;j {
printf("%d ",result[i][j]);
}
printf("\n");
}
return 0;
}
/*
第 1种方案:1 2 3
第 2种方案:1 2 4
第 3种方案:1 2 5
第 4种方案:1 2 6
第 5种方案:1 2 7
第 6种方案:1 3 4
第 7种方案:1 3 5
第 8种方案:1 3 6
第 9种方案:1 3 7
第 10种方案:1 4 5
第 11种方案:1 4 6
第 12种方案:1 4 7
第 13种方案:1 5 6
第 14种方案:1 5 7
第 15种方案:1 6 7
第 16种方案:2 3 4
第 17种方案:2 3 5
第 18种方案:2 3 6
第 19种方案:2 3 7
第 20种方案:2 4 5
第 21种方案:2 4 6
第 22种方案:2 4 7
第 23种方案:2 5 6
第 24种方案:2 5 7
第 25种方案:2 6 7
第 26种方案:3 4 5
第 27种方案:3 4 6
第 28种方案:3 4 7
第 29种方案:3 5 6
第 30种方案:3 5 7
第 31种方案:3 6 7
第 32种方案:4 5 6
第 33种方案:4 5 7
第 34种方案:4 6 7
第 35种方案:5 6 7
请按任意键继续. . .
*/

回答2:

3层for循环
int a,b,c;
for(a=1;a<7;a++)
for(b=1;b<7;b++)
for(c=1;c<7;c++)
if(a!=b&&b!=c&&a!=c)
printf("%d %d %d\n",a,b,c);

回答3:

#include
using namespace std;

int main()
{
int i[3];
for (i[0] = 1; i[0] <= 6; ++i[0])
{
for (i[1] = 1; i[1] <= 6; ++i[1])
{
for (i[2] = 1; i[2] <= 6; ++i[2])
{
cout << i[0] << i[1] << i[2] << endl;
}
}
}
return 0;
}

回答4:

第一个:
#include
main()
{ int n,i;
char a[10];
scanf("%s",a);
n=strlen(a);
for(i=0;i<=n-2;i++)
printf("%c,",a[i]);
printf("%c",a[i]);
}
改过之后的:
#include
#include
main()
{ int n,i;
long j;
char a[10];
scanf("%s",a);
n=strlen(a);
j=pow(10,(n-1)); /*10的n-1次方*/
for(i=0;i<=n-1;i++) /*输出原数据*/
printf("%c",a[i]);
printf("=");
for(i=0;i<=n-2;i++) /*输出后面的计算过程*/
{printf("%c*%ld+",a[i],j);
j=j/10;}
printf("%c",a[i]);
}