n个数字组成的三位数

来源:互联网 发布:守夜人社工库源码 编辑:程序博客网 时间:2024/05/29 10:54

1.原题目描述:有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

分析:这个题是一个很简单的题目:


代码如下:

// 1-4  4个数字组成多少个互不相同且无重复数字的三位数?都是什么?一共有多少个?void main(){int count =0;for(int i=1; i<5; i++)for( int j =1;j<5; j++)for(int k=1; k<5; k++){if( i!=j && i!=k && j!=k ){printf("%d%d%d  ",i,j,k);count ++;if( count%10 == 0 ){printf("\n");}}}printf("\n\n总的三位数个数为:%d\n\n",count);}

2.觉得比较简单,进行了一步拓展:

拓展题目描述:   0-9  10个数字组成多少个互不相同且无重复数字的三位数?都是什么?一共有多少个?


分析:这也比较简单


代码如下:

// 0-9  10个数字组成多少个互不相同且无重复数字的三位数?都是什么?一共有多少个?void main(){int count =0;for(int i=1; i<10; i++)for( int j =0;j<10; j++)for(int k=0; k<10; k++){if( i!=j && i!=k && j!=k ){printf("%d%d%d  ",i,j,k);count ++;if( count%10 == 0 ){printf("\n");}}}printf("\n\n总的三位数个数为:%d\n\n",count);}

3.思考了一下,进行了进一步的拓展:

拓展题目描述: 0 -9 这10个数字能能组成多少个互不相同的且无重复的 位数


分析:这个题目相对来说,稍微难一点。我们很容易想到 10 重循环,这比较容易实现,但是不是很理想的算法。

我是这样想的,把所有的十位数,转化为求 第一位数不为零的10个数的全排列 。 所以 我是用递归实现的

因为这要列举所有的十位数,所以必需全部循环到,因此运行的时间比较长


代码如下:


int j=0;//全局变量,用于控制第一位数的下标//两个数位置进行交换void swap(int *a,int *b){int temp;temp = *a;*a = *b;*b = temp;}//递归实现全排列void sort(int *list,int k,int n)//list[k..n]的全排列{if( k == n )//输出一个排列{printf("%d ",list[j]);//输出全排列的第一个数for( int i=j+1; i<= n;i++)printf("%d ",list[i]);printf("\n");}else{for( int i=k; i<=n; i++ ){swap(&list[k],&list[i]);//交换两个元素sort(list,k+1,n);swap(&list[k],&list[i]);}}}void main(){//            0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 int list[] = {1,2,3,4,5,6,7,8,9,0, 1, 2, 3, 4, 5, 6, 7, 8};for(int i=0; i<8; i++)//全排列的第一个数为list[i]{j=i;sort(list,j+1,9+j);//第 2-10 个数进行全排列}}







原创粉丝点击