#include <stdio.h>
#include <stdlib.h>
//用户随机输入4个0到9的整数(不全为0),计算这4个数字一共能组成多少个不同的4位数
int main(){
int i[4];//用来接收用户提供的4个数
int n=0;//循环变量
int m=0;//数组中已经存在的4位数
int pd=0;//判断
int num[4*3*2];//4个元素排列最多就24种排列方式
int numd=0;
int xhbl1=0,xhbl2=0,xhbl3=0,xhbl4=0;
F1:
for(n=0;n<4;n++){
printf("请输入第%d个数:",n+1);
//接收用户输入并判断输入是否合法,如果非法则重新输入
do{
pd=scanf("%d",&i[n]);
if (i[n]>9||pd==0||i[n]<0){
printf("输入非法!请重新输入:");
fflush(stdin);//清空缓存
}
}while(i[n]>9||pd==0||i[n]<0);
}
if(i[0]==0&&i[1]==0&&i[2]==0&&i[3]==0){
system("cls");//清屏
printf("输入的4个值全为0,请重新输入!\n");
goto F1;//执行到这里说明4次输入全为0,要求重新输入
}
//计算,将可能的值赋给num数组
xhbl1=0,xhbl2=0,xhbl3=0,xhbl4=0;
for(xhbl1=0;xhbl1<4&&i[xhbl1]!=0;xhbl1++){//最高位不为0
for(xhbl2=0;xhbl2<4;xhbl2++){
if(xhbl1==xhbl2)continue;//第二位不与第一位取同一元素
for(xhbl3=0;xhbl3<4;xhbl3++){
if(xhbl3==xhbl1||xhbl3==xhbl2)continue;//第三位不与前2位取同一元素
for(xhbl4=0;xhbl4<4;xhbl4++){
if(xhbl4==xhbl1||xhbl4==xhbl2||xhbl4==xhbl3)continue;//第四位不与前3位取同一元素
numd=i[xhbl1]*1000+i[xhbl2]*100+i[xhbl3]*10+i[xhbl4];//完成组合,将组合后的数赋值给numd
//比较
for(n=0;n<m&&m<=24&&m!=0;n++){
if(numd==num[n]){//如果查找到相同元素直接退出查找循环
break;
}
}
if(n==m){//n==m说明没有重复(没有查找到重复)
num[m]=numd;//将不重复的值赋值给num数组
m++;//记录数组中当前用多少个元素
}
}
}
}
}
printf("一共有%d中组合方法.\n",m);
for (n=0;n<m;n++){
printf("%d\t",num[n]);
}
return 0;
}
用4层for循环完成4个元素的所有不重复排列,但用户有可能给出2个或多个相同的元素,从而造成排列结果的重复,所以采用了一个数组来接收所以的组合,每次新组合一个数就和已经得到的组合比较,排除重复的组合.