程序如下:
#include "stdio.h"
#include "time.h"
unsigned char number[100]; //最多求100个数的组合。
unsigned int m,n;// 2<=m<=100,n
char tmpbuf[128];
time_t ltime;
struct tm *today;
void printtime(void) //打印当前时间的函数
{
time(
printf("%sn",tmpbuf);
}
void inition() //初始化
{
unsigned int i;
for(i=0;i
}
void output() //输出组合结果
{
unsigned int i;
for(i=0;i
printf("%02d ",i+1);
printf("n");
}
void main()
{
unsigned long count; //计数组合个数
unsigned int i,j,k,l;
bool findfirst,end,swap;
end=false;
printf("please input m:");
scanf("%d",&m); //输入m
printf("please input n:");
scanf("%d",&n); //输入n
printtime(); //打印开始时间
inition(); //初始化
//output(); //屏蔽掉结果输出以节约时间
count=1;
j=m;
while(!end)
{
findfirst=false;
swap=false; //标志复位
for(i=0;i
if(!findfirst && number[i])
{
k=i; //k记录下扫描到的第一个数
findfirst=true; //设置标志
}
if(number[i] && !number[i+1]) //从左到右扫描第一个“10”组合
{
number[i]=0;
number[i+1]=1;
swap=true; //设置交换标志
for(l=0;l
for(l=i-k;l number[l]=0; //交换后将之前的“1”全部移动到最左端
if(k==i && i+1==m-n) //如果第一个“1”已经移动到了m-n的位置,说明
这是最后一个组合了。
end=true;
}
if(swap) //交换一次后就不用继续找“10”组合了
break;
}
//output(); //屏蔽掉结果输出以节约时间
count++; //组合数计数器递增1
}
printtime(); //打印结束时间
printf("total number of combination is: %dn",count); //打印总的组合数
getchar();
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/82394/viewspace-905988/ ,如需转载,请注明出处,否则将追究法律责任。