C语言求不重复的3位数代码及解析
问题描述
用1、2、3、4、5共5个数字能组成多少个互不相同且无重复数字的三位数?都是多少?
问题分析
求互不相同的三位数,可以一位一位的去确定,先确定百位、再确定十位、个位,再将各位上的数值进行比较,若互不相同则输出。
算法设计
1) 利用多重循环嵌套的for语句实现。
2) 用三重循环分别控制百位、十位、个位上的数字,它们都可以是1、2、3、4、5。
3) 在已组成的排列数中,还要再去掉出现重复的1、2、3、4、5这些数字的不满足条件的排列。
题目要求最后输出满足条件的数据个数,需要一个变量count充当计数器的作用,有一个满足条件的数据出现计数器的值加1。为了使每行能输出6个数字,每输出一个数字就对count的值进行判断看是否能被6整除,若能整除则输出换行符。
if (count%8==0)
printf("\n");
下面是完整的代码:
#include <stdio.h>
int main()
{
int i, j, k, count=0;
for(i=1; i<6; i++)
for(j=1; j<6; j++)
for(k=1; k<6; k++)
{
if(i!=k && i!=j && j!=k) /*判断三个数是否互不相同*/
{
count++;
printf("%d%d%d ", i, j, k);
if(count%6 == 0) /*每输出8个数换行*/
printf("\n");
}
}
printf("\n总个数是 %d.\n", count);
return 0;
}
运行结果:
123 124 125 132 134 135
142 143 145 152 153 154
213 214 215 231 234 235
241 243 245 251 253 254
312 314 315 321 324 325
341 342 345 351 352 354
412 413 415 421 423 425
431 432 435 451 452 453
512 513 514 521 523 524
531 532 534 541 542 543
总个数是 60.
知识点补充
上面程序段的效率较低,因为无论i与j的值是否相等,k都要从1〜5把所有值遍历完,根据题目要求只要i与j的值相等,那么k的取值就没必要进行,因为无论k的值是多少,最后组成的三位数中总有相同的数字。对于本题来说,因取值范围较小,所以算法效率的高低相差并不大,但是对于取值范围大的题目,两种算法效率相差是很明显的。
程序代码改写如下:
#include<stdio.h>
int main ()
{
int i, j, k, count=0;
for(i=1; i<6; i++)
for(j=1; j<6; j++)
for(k=1; k<6 && j!=i; k++)
{
if(k!=j && k!=i)
{
printf("%d%d%d", i, j, k);
count++;
if(count%6==0)
printf ("\n");
}
}
printf("\n总个数是 %d.\n", count);
return 0;
}