排列问题-c语言代码实战

来源:互联网 发布:软件无线电 军用 编辑:程序博客网 时间:2024/06/03 18:47
#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个或多个相同的元素,从而造成排列结果的重复,所以采用了一个数组来接收所以的组合,每次新组合一个数就和已经得到的组合比较,排除重复的组合.