unsigned char number[100]; // 最多求100个数的组合。
unsigned int m, n; // 2 <=m <=100,n <m
char tmpbuf[128];
time_t ltime;
struct tm *today;
void printtime(void) // 打印当前时间的函数
{
time(<ime);
today = localtime(<ime);
strftime(tmpbuf, 128, "%Y-%m-%d %H:%M:%S", today);
printf("%s\n", tmpbuf);
}
void inition() // 初始化
{
unsigned int i;
for (i = 0; i < n; i++)
number[i] = 1;
}
void output() // 输出组合结果
{
unsigned int i;
for (i = 0; i < m; i++)
if(number[i])
printf("%02d ", i+1);
printf("\n");
}
int main()
{
unsigned long count; // 计数组合个数
unsigned int i, j, k, l;
bool findfirst, end, swap;
end = false;
printf("please input m:");
scanf("%d",&m);
printf("please input n:");
scanf("%d",&n);
printtime(); // 打印开始时间
inition(); // 初始化
output(); // 输出结果
count = 1;
j = m;
while (!end)
{
findfirst = false;
swap = false; // 标志复位
for ( i = 0; i < j; 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 < i - k; l++)
number[l] = number[k+l];
for (l = i-k; l < i; 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: %d\n",count); //打印总的组合数
getchar();
getchar();
return 1;
}
unsigned int m, n; // 2 <=m <=100,n <m
char tmpbuf[128];
time_t ltime;
struct tm *today;
void printtime(void) // 打印当前时间的函数
{
time(<ime);
today = localtime(<ime);
strftime(tmpbuf, 128, "%Y-%m-%d %H:%M:%S", today);
printf("%s\n", tmpbuf);
}
void inition() // 初始化
{
unsigned int i;
for (i = 0; i < n; i++)
number[i] = 1;
}
void output() // 输出组合结果
{
unsigned int i;
for (i = 0; i < m; i++)
if(number[i])
printf("%02d ", i+1);
printf("\n");
}
int main()
{
unsigned long count; // 计数组合个数
unsigned int i, j, k, l;
bool findfirst, end, swap;
end = false;
printf("please input m:");
scanf("%d",&m);
printf("please input n:");
scanf("%d",&n);
printtime(); // 打印开始时间
inition(); // 初始化
output(); // 输出结果
count = 1;
j = m;
while (!end)
{
findfirst = false;
swap = false; // 标志复位
for ( i = 0; i < j; 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 < i - k; l++)
number[l] = number[k+l];
for (l = i-k; l < i; 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: %d\n",count); //打印总的组合数
getchar();
getchar();
return 1;
}