c语言打印和统计所有不重复的8位数

思路1:遍历所有8位数,判断是否每一位都不重复。判断方法是用一个数组记录每一位,然后数组内的元素两两比较,看是否各不相同。

#include<stdio.h>
#define N 8   //改变N的值可以输出2~10的不重复数
/*onlyone(n) judge that if n is a number without repetition*/
int onlyone(long n){
    int a[N],i,j;
    for(i=0;i<N;i++){
        a[i]=n%10; 
        n/=10;}
    for(i=0;i<N-1;i++)
        for(j=i+1;j<N;j++)
            if(a[i]==a[j])return 0;
    return 1;
}

int main(){
    long i,t1=1,t2;
    long c1=0,c2=9;
    for(i=1;i<N;i++)c2*=10-i; //c2=C(9,1)*A(9,N-1)
    for(i=1;i<N;i++)t1*=10;  //t1=10^(N-1)
    t2=t1*10;               //t2=10^N
    for(i=t1;i<t2;i++)
        if(onlyone(i)){c1++;printf("%ld\n",i);}
    printf("count=%ld,c2=C(9,1)*A(9,N-1)=%ld,count-c2=%ld\n",c1,c2,c1-c2);
    return 0;
} 

思路2:采用8级嵌套循环,每级循环遍历剔除上级循环的数字后剩下的数。这是一种比较笨的土方法,而且不易扩展。但这个方法能够成功也是编程实力的一种体现。

#include<stdio.h>
int main(void){
	int i1,i2,i3,i4,i5,i6,i7,i8,j;
    int a2[9],a3[8],a4[7],a5[6],a6[5],a7[4],a8[3];
    long c1=0,c2=9*9*8*7*6*5*4*3; //统计共有多少种组合
//共8级嵌套循环,每级代表一位,每位用一个数组储存可供选择的数字
    for(i1=1;i1<=9;i1++){        
        for(j=0;j<9;j++) a2[j]=j>=i1?j+1:j;        
        for(i2=0;i2<9;i2++){         
            for(j=0;j<8;j++) a3[j]=j>=i2?a2[j+1]:a2[j];             
            for(i3=0;i3<8;i3++){                 
                for(j=0;j<7;j++) a4[j]=j>=i3?a3[j+1]:a3[j];                
                for(i4=0;i4<7;i4++){                    
                    for(j=0;j<6;j++) a5[j]=j>=i4?a4[j+1]:a4[j];
                    for(i5=0;i5<6;i5++){                        
                        for(j=0;j<5;j++) a6[j]=j>=i5?a5[j+1]:a5[j];
                        for(i6=0;i6<5;i6++){                            
                            for(j=0;j<4;j++) a7[j]=j>=i6?a6[j+1]:a6[j];
                            for(i7=0;i7<4;i7++){                              
                                for(j=0;j<3;j++) a8[j]=j>=i7?a7[j+1]:a7[j];
                                for(i8=0;i8<3;i8++){                                    
                                    printf("%d%d%d%d%d%d%d%d\n",i1,a2[i2],a3[i3],a4[i4],a5[i5],a6[i6],a7[i7],a8[i8]);
                                    c1++;}}}}}}}}
    printf("total=%ld,C(1,9)*A(7,9)=%ld,total-C(1,9)*A(7,9)=%ld\n",c1,c2,c1-c2); //验证组合种数与循环次数是否相同 */
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值