C语言打印一窜数字的所有组合

来源:百度知道 编辑:UC知道 时间:2024/09/25 12:09:23
有一窜数字1233456778.按要求打印组合。
1:打印所有组合,不能有重复,且数字组合中不能有重复出现的数字。
2:打印所有组合,不能有重复,但数字组合中可以有重复出现的数字(即一种组合中,3与7最多可以同时出现2个。但其余数字不能有重复)。
3:打印所有组合,不能有重复,但数字组合中可以有重复出现的数字(即一种组合中,3与7最多可以同时出现2个。但其余数字不能有重复)。且地三位不能是3,第七位不能是7。
只要可以帮我解答到问题的都有分,全部问题都解答完的,我把我全部分都给你。

1.楼主的数太多了,我的机器有点落伍,显示的时间有点漫长~~~~,我把数改成了1,2,3,3,4,7,7。显示上也简单点,原理是一样的。。。另外不是很清楚楼主的所有组合是不是包括取出一部分字符串做排列组合,我弄的是所有

数字用上的全排列,就是没有12,13这样的组合数,楼主如果是需要显示这样的数,只要在主函数中做循环,分别取出1至7个数再运行deal和排列函数就行(注,调试环境是VC++6.0)
#include "stdio.h"
#include "stdlib.h"
#define NUM 30
#define N 7 //数组元素个数
static int cnt=0;//用于记录重复数字的个数
void print(int n,int arr[]){
int i;
static int count=0;
printf("%d:",++count);
for(i=0;i<n;i++)
printf("%d",arr[i]);
printf("\t");
if(count%5==0)
printf("\n");
}

void arrange(int size,int arr[],int p){
//算法思想:采用经典回溯法,先确定第一个位置,再对余下的n-1位数字做全排列
//每组全排列后均把所有参与此次全排列的数与这次全排列的第一个数交换后再重复排列
//例如递归到排列1234后回溯一次即排列34,将4与3交换,再回溯至排列234分别将34与2交换后排列
//直至排列完成后,再分别将234与1交换后排列
//不过算法效率在数字过大后就比较低下了,楼主可以去网上找找更高效的算法
int i,temp;
if(p+1==size){//排列完成后打印
print(size,arr);
retur