1、问题描述:小明有5本新书,要借给A、B、C这3位小朋友,若每个人只能借1本,则可以有多少种不同的借法?
2、问题分析:本题属于数学中的排列组合问题,即求5个数中任取3个数进行排列的所有可能数。本题需要进行穷举,穷举出所有可能后,剔除掉不符合题设条件的可能,剩下的便是符合题意的解。由数学知识可得本题共有60种方法,所以此法可以用来大致判断运行结果是否正确。
3、算法设计:因为本题要采用穷举法列出所有可能后,剔除掉不符合条件的那些可能,所以需要进行三重循环来列举所有可能,再用if条件语句进行筛选,if的条件应为(A!=B&&A!=C&&B!=C)。
4、完整程序:
#include "stdio.h" void main() { int A,B,C,i=1; //A,B,C分别代表A,B,C三人,i代表可能数 printf("以下为所有可能解法:\n"); for(A=1;A<=5;A++) //A的所有可能 for(B=1;B<=5;B++) //B的所有可能 for(C=1;C<=5;C++) //C的所有可能 { if(A!=B&&A!=C&&B!=C) //条件判断 { printf("第%2d种:A:%2d B:%2d C:%2d ",i,A,B,C); //输出 if(i%2==0) printf("\n"); i++; } } }
5、运行结果:
以下为所有可能解法:
第 1种:A: 1 B: 2 C: 3 第 2种:A: 1 B: 2 C: 4
第 3种:A: 1 B: 2 C: 5 第 4种:A: 1 B: 3 C: 2
第 5种:A: 1 B: 3 C: 4 第 6种:A: 1 B: 3 C: 5
第 7种:A: 1 B: 4 C: 2 第 8种:A: 1 B: 4 C: 3
第 9种:A: 1 B: 4 C: 5 第10种:A: 1 B: 5 C: 2
第11种:A: 1 B: 5 C: 3 第12种:A: 1 B: 5 C: 4
第13种:A: 2 B: 1 C: 3 第14种:A: 2 B: 1 C: 4
第15种:A: 2 B: 1 C: 5 第16种:A: 2 B: 3 C: 1
第17种:A: 2 B: 3 C: 4 第18种:A: 2 B: 3 C: 5
第19种:A: 2 B: 4 C: 1 第20种:A: 2 B: 4 C: 3
第21种:A: 2 B: 4 C: 5 第22种:A: 2 B: 5 C: 1
第23种:A: 2 B: 5 C: 3 第24种:A: 2 B: 5 C: 4
第25种:A: 3 B: 1 C: 2 第26种:A: 3 B: 1 C: 4
第27种:A: 3 B: 1 C: 5 第28种:A: 3 B: 2 C: 1
第29种:A: 3 B: 2 C: 4 第30种:A: 3 B: 2 C: 5
第31种:A: 3 B: 4 C: 1 第32种:A: 3 B: 4 C: 2
第33种:A: 3 B: 4 C: 5 第34种:A: 3 B: 5 C: 1
第35种:A: 3 B: 5 C: 2 第36种:A: 3 B: 5 C: 4
第37种:A: 4 B: 1 C: 2 第38种:A: 4 B: 1 C: 3
第39种:A: 4 B: 1 C: 5 第40种:A: 4 B: 2 C: 1
第41种:A: 4 B: 2 C: 3 第42种:A: 4 B: 2 C: 5
第43种:A: 4 B: 3 C: 1 第44种:A: 4 B: 3 C: 2
第45种:A: 4 B: 3 C: 5 第46种:A: 4 B: 5 C: 1
第47种:A: 4 B: 5 C: 2 第48种:A: 4 B: 5 C: 3
第49种:A: 5 B: 1 C: 2 第50种:A: 5 B: 1 C: 3
第51种:A: 5 B: 1 C: 4 第52种:A: 5 B: 2 C: 1
第53种:A: 5 B: 2 C: 3 第54种:A: 5 B: 2 C: 4
第55种:A: 5 B: 3 C: 1 第56种:A: 5 B: 3 C: 2
第57种:A: 5 B: 3 C: 4 第58种:A: 5 B: 4 C: 1
第59种:A: 5 B: 4 C: 2 第60种:A: 5 B: 4 C: 3
请按任意键继续. . .
6、问题拓展:
上述代码是在列举完所有可能后进行的条件筛选,我们可以将上述筛选分两步进行,在进行第三重循环前,对A与B进行条件筛选,即为如下代码:
for(A=1;A<=5;A++)
for(B=1;B<=5;B++)
for(C=1;C<=5&&A!=B;C++)
{输出;} //已经验证过,也是正确的