热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言借书方案知多少代码解析

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

问题描述

小明有5本新书,要借给A、B、C这3位小朋友,若每人每次只能借1本,则可以有多少种不同的借法?

问题分析

本题属于数学当中常见的排列组合问题,即求从5个数中取3个不同数的排列组合的总数。可以将5本书进行1〜5的编号,A、B、C 3个人每次都可以从5本书中任选1本,即每人都有5种选择,由于1本书不可能同时借给一个以上的人,因此只要这3个人所选书的编号不同,即为一次有效的借阅方法。

算法设计

对于每个人所选书号,可以采用穷举循环来实现,即从每个人可选书号(1、2、 3、4、5)的范围内进行穷举,从而得到可行的结果。对第1个人的选择,可以用循环将其列出:for(a=1;  a<=5;  a++),对于第2个人、第3个人可以用同样的方法。由于一本书只能借给一个人,所以第2个人的选择会受到第1个人的限制,最后一个人的选择会受到第2个人的限制,即后面的选择都是在前面选择的前提下进行的,所以可釆用循环的嵌套来解决问题。

下面是完整的代码:

#include
int main()
{
    int a, b, c, i=0;  /*a,b,c分别用来记录三个人所选新书编号,i用来控制有效借阅次数*/
    printf("A,B,C三人所选书号分别为:\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 && c!=b)  /*此条件用来控制有效借阅组合*/
                {
                    printf("A:%2d B:%2d c:%2d  ", a, b, c);
                    i++;
                    if(i%4==0)
                        printf("\n");
                }  /*每行最多输出4种借阅方法组合*/

    printf("共有%d种有效借阅方法\n",i);  /*输出有效的借阅方法总数*/

    return 0;
}

运行结果:

A,B,C三人所选书号分别为:
A: 1 B: 2 c: 3  A: 1 B: 2 c: 4  A: 1 B: 2 c: 5  A: 1 B: 3 c: 2 
A: 1 B: 3 c: 4  A: 1 B: 3 c: 5  A: 1 B: 4 c: 2  A: 1 B: 4 c: 3 
A: 1 B: 4 c: 5  A: 1 B: 5 c: 2  A: 1 B: 5 c: 3  A: 1 B: 5 c: 4 
A: 2 B: 1 c: 3  A: 2 B: 1 c: 4  A: 2 B: 1 c: 5  A: 2 B: 3 c: 1 
A: 2 B: 3 c: 4  A: 2 B: 3 c: 5  A: 2 B: 4 c: 1  A: 2 B: 4 c: 3 
A: 2 B: 4 c: 5  A: 2 B: 5 c: 1  A: 2 B: 5 c: 3  A: 2 B: 5 c: 4 
A: 3 B: 1 c: 2  A: 3 B: 1 c: 4  A: 3 B: 1 c: 5  A: 3 B: 2 c: 1 
A: 3 B: 2 c: 4  A: 3 B: 2 c: 5  A: 3 B: 4 c: 1  A: 3 B: 4 c: 2 
A: 3 B: 4 c: 5  A: 3 B: 5 c: 1  A: 3 B: 5 c: 2  A: 3 B: 5 c: 4 
A: 4 B: 1 c: 2  A: 4 B: 1 c: 3  A: 4 B: 1 c: 5  A: 4 B: 2 c: 1 
A: 4 B: 2 c: 3  A: 4 B: 2 c: 5  A: 4 B: 3 c: 1  A: 4 B: 3 c: 2 
A: 4 B: 3 c: 5  A: 4 B: 5 c: 1  A: 4 B: 5 c: 2  A: 4 B: 5 c: 3 
A: 5 B: 1 c: 2  A: 5 B: 1 c: 3  A: 5 B: 1 c: 4  A: 5 B: 2 c: 1 
A: 5 B: 2 c: 3  A: 5 B: 2 c: 4  A: 5 B: 3 c: 1  A: 5 B: 3 c: 2 
A: 5 B: 3 c: 4  A: 5 B: 4 c: 1  A: 5 B: 4 c: 2  A: 5 B: 4 c: 3 
共有60种有效借阅方法

#C语言借书方案知多少代码解析

知识点补充

利用循环解决问题的时候,找到循环的三要素:循环变量的初值、循环的控制条件,以及使循环趋于结束的循环变量值的改变是进行编程的关键。读者可参照第一个例子来找一下本题中所对应的循环三要素。本题的输出结果有一个条件限制,即3个人所选书号各不相同。在输出语句前只要用一个if语句if(a!=b && a!=c && c!=b)判断即可。


推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
author-avatar
帅哥不潮_460
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有