用1、2、3、4共4个数字能组成多少个互不相同且无重复数字的三位数?都是多少?
求互不相同的三位数,可以一位一位的去确定,先确定百位、再确定十位、个位,再将各位上的数值进行比较,若互不相同则输出。
1) 利用多重循环嵌套的for语句实现。
2) 用三重循环分别控制百位、十位、个位上的数字,它们都可以是1、2、3、4。
3) 在已组成的排列数中,还要再去掉出现重复的1、2、3、4这些数字的不满足条件的排列。
题目要求最后输出满足条件的数据个数,需要一个变量count充当计数器的作用,有一个满足条件的数据出现计数器的值加1。为了使每行能输出8个数字,每输出一个数字就对count的值进行判断看是否能被8整除,若能整除则输出换行符。
下面是完整的代码:
- #include <stdio.h>
- int main()
- {
- int i, j, k, count=0;
- for(i=1; i<5; i++)
- for(j=1; j<5; j++)
- for(k=1; k<5; k++)
- {
- if(i!=k && i!=j && j!=k) /*判断三个数是否互不相同*/
- {
- count++;
- printf("%d%d%d ", i, j, k);
- if(count%8 == 0) /*每输出8个数换行*/
- printf("\n");
- }
- }
- printf("\nThe total number is %d.\n", count);
-
- return 0;
- }
运行结果:
123 124 132 134 142 143 213 214
231 234 241 243 312 314 321 324
341 342 412 413 421 423 431 432
The total number is 24.
上面程序段的效率较低,因为无论i与j的值是否相等,k都要从1〜4把所有值遍历完,根据题目要求只要i与j的值相等,那么k的取值就没必要进行,因为无论k的值是多少,最后组成的三位数中总有相同的数字。对于本题来说,因取值范围较小,所以算法效率的高低相差并不大,但是对于取值范围大的题目,两种算法效率相差是很明显的。
程序代码改写如下:
- #include<stdio.h>
- int main ()
- {
- int i, j, k, count=0;
- for(i=1; i<5; i++)
- for(j=1; j<5; j++)
- for(k=1; k<5 && j!=i; k++)
- {
- if(k!=j && k!=i)
- {
- printf("%d%d%d", i, j, k);
- count++;
- if(count%8==0)
- printf ("\n");
- }
- }
- printf("\nThe total number is %d.\n", count);
- return 0;
- }