C语言算法练习之佩奇借书

目录
  • 1. 问题描述
  • 2. 题目分析
  • 3. 算法设计
  • 4. 代码实现
  • 5. 算法升级

1. 问题描述

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

2. 题目分析

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

3. 算法设计

对于每个人所选书号,我们可以采用穷举循环来实现,即从每个人可选书号(1、2、3、4、5)的范围内进行穷举,从而得到可行的结果。 对第 1 个人的选择,我们可以用循环将其列出::for (a = 1; a <= 5; a++),同理对于第 2 个人、第 3 个人可以用同样的方法。 由于一本书只能借给一个人,所以第 2 个人的选择会受到第 1 个人的限制,最后一个人的选择会受到第 2 个人的限制,即后面的选择都是在前面选择的前提下进行的,所以可采用循环的嵌套来解决问题。 利用循环解决问题的时候,找到循环的三要素:循环变量的初值、循环的控制条件,以及使循环趋于结束的循环变量值的改变是进行编程的关键。

4. 代码实现

完整代码

int main()
{
	int a, b, c = 0; //a、b、c分别用来记录3个人所选新书编号
	int cnt = 0; //用来统计借阅的方法

	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:%d号  B:%d号  C:%d号  |  ", a, b, c);
					cnt++;

					if (cnt % 4 == 0) //打印4列在屏幕上显示
					{
						printf("\n");
					}
				}
			}
		}
	}
	printf("总共有%d种有效的借阅方法\n", cnt); //输出有效的借阅方法总数

	return 0;
}

运行结果

本题的输出结果有一个条件限制,即 3 个人所选书号各不相同,所以在输出语句前只要用一个 if 语句 if(a!=b && a!=c && c!=b)判断即可。

5. 算法升级

对于原程序中的第三层 for 循环来说不管 a、b 的取值是否相同,循环都要重复进行 5 次。 如果A 和 B 所选书号相同,那么无论 C 选什么书号都是无效的借阅方法。因此在执行第 3 个循环之前可先行判定A、B 两人的编号是否相同,进而提高程序效率。

修改后的程序在进入循环体之前首先判断a、b的取值,如果两者取值相同,内层循环无须重复执行5次便可结束。

完整代码

到此这篇关于C语言算法练习之佩奇借书的文章就介绍到这了,更多相关C语言 佩奇借书内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言每日练习之乒乓球比赛问题

    目录 题目描述 分析 代码实现 后期完善 网上参考 解法一: 解法二: 总结 题目描述 两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单 分析 简单的组合问题,而且不考虑排序,如果固定a,b,c分别在0-2三个比赛队伍,那么两球队最多3种组合方式,全部轮询一遍即可. 代码实现 代码写的有点糟 #include <stdio.h> int main() { in

  • C语言每日练习之字符串反转

    目录 分析 代码实现 网上参考 总结 分析 在第18天:利用递归函数调用方式,将所输入的字符以相反顺序打印出来中,已经用过递归实现字符顺序输入,逆序输出,今天的题目是字符串反转,将以字符数组的形式来进行操作. 代码实现 #include <stdio.h> #include <string.h> #define MAX_LENGTH 50 //最大长度 char *String_Invertion(char *str); int main() { char string[MAX_L

  • C语言算法练习之打鱼还是晒网

    1. 问题描述 中国有句俗语叫 " 三天打鱼两天晒网 ".某人从 1990 年 1 月 1 日起开始 "三天打鱼两天晒网",问这个人在以后的某一天中是 "打鱼" 还是 "晒网". 2. 题目分析 根据题意可以将解题过程分为 3 步: (1) 计算从 1990 年 1 月 1 日开始至指定日期共有多少天. (2) 由于 "打鱼" 和 "晒网" 的周期为 5 天,所以将计算出的天数用 5 去

  • C语言每日练习之二叉堆

    目录 一.堆的概念 1.概述 2.定义 3.性质 4.作用 二.堆的存储结构 1.根结点编号 2.孩子结点编号 3.父结点编号 4.数据域 5.堆的数据结构 三.堆的常用接口 1.元素比较 2.交换元素 3.空判定 4.满判定 5.上浮操作 6.下沉操作 四.堆的创建 1.算法描述 2.动画演示 3.源码详解 五.堆元素的插入 1.算法描述 2.动画演示 3.源码详解 五.堆元素的删除 1.算法描述 2.动画演示 3.源码详解 总结 一.堆的概念 1.概述 堆是计算机科学中一类特殊的数据结构的统

  • C语言每日练习之求两个矩阵的乘积详解

    目录 分析 代码实现 总结 分析 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中. 矩阵的乘法有以下注意事项: 1.当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘. 2.矩阵C的行数等于矩阵A的行数,C的列数等于B的列数. 3.乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和. 代码实现:只需要用矩阵乘积的公式求出新的矩阵,即为两个矩阵的乘积,程序中

  • C语言每日练习之进制转换

    目录 分析 代码实现 网上参考 总结 分析 我一开始的想法是通过输入整数形式八进制来转换成十进制输出,后来发现用字符数组输入更方便.我这里就讲讲我用整型数据输入的转换思路: 我们都知道二进制由0和1组成,3位二进制组成在一起,就可以表示0-7这八个数,所以八进制实际上就是3位二进制的组合(同理十六进制是4位二进制的组合),C语言的位运算操作的是二进制,算术运算针对的是十进制,所以,我们可以通过位运算求出八进制的每一位数(3位二进制为1位),然后通过算术运算符+,将他们加起来.和十进制运算不同的地

  • C语言每日练习之冒泡排序

    目录 分析 代码实现 运行结果 总结 分析 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 冒泡排序(这里只讨论从小到大排序)可以通过二种方式实现,分别是将最小值依次移动到头部和将最大值依次移动到尾部. 代码实现 代码采用从数组头部轮询的方式: #include <stdio.h> #define INTEGER_RANGE 10 //数字范围 void bubule_sort(int *array, int len); int main() { int i =

  • C语言算法练习之抓交通肇事犯

    1. 问题描述 一辆卡车违反交通规则,撞人后逃跑.现场有三人目击该事件,但都没有记住车号,只记下车号的一些特征. 甲说:牌照的前两位数字是相同的: 乙说:牌照的后两位数字是相同的,但与前两位不同: 丙是数学家,他说:四位的车号刚好是一个整数的平方. 请根据以上线索求出车号. 2. 题目分析 按照题目的要求造出一个前两位数相同.后两位数相同且相互间又不同的 4 位整数,然后判断该整数是否是另一个整数的平方. 即求一个四位数 a 1.a 2 .a 3. a 4,满足如下的条件: 3. 算法设计 该题

  • C语言算法练习之佩奇借书

    目录 1. 问题描述 2. 题目分析 3. 算法设计 4. 代码实现 5. 算法升级 1. 问题描述 佩奇有5本新书,要借给A.B.C这3位小朋友,若每人每次只能借1本,则可以有多少种不同的借法? 2. 题目分析 本题属于数学当中常见的排列组合问题,即求从 5 个数中取 3 个不同数的排列组合的总数. 我们可以将 5 本书进行 1-5 的编号,A.B.C 3个人每次都可以从 5 本书中任选 1 本,即每人都有 5 种选择,由于 1 本书不可能同时借给一个以上的人,因此只要这 3 个人所选书的编号

  • C语言算法练习之佩奇存钱方案

    目录 1. 问题描述 2. 问题分析 3. 算法设计 4. 代码实现 1. 问题描述 假设银行一年整存零取的月息为 0.63%. 现在佩奇手中有一笔钱,她打算在今后的 5 年中的每年年底取出 1000 元,到第 5 年时刚好取完. 请算出佩奇存钱时应存入多少? 2. 问题分析 根据题意,可以从第 5 年向前推算. 已知 “在今后的 5 年中,每年的年底取出 1000 元,这样到第 5 年的时候刚好可以取完”,因此,第 5 年年底会取出 1000 元,则可以计算出第 5 年年初在银行中所存的钱数为

  • 利用Java异常机制实现模拟借书系统

    本文介绍的是利用java语言实现一个控制台版的模拟借书系统,在开始本文的正式内容之前,我们先来了解一下Java异常机制. 什么是异常? 异常,不正常也.Exception是Exception event的缩写,因此异常是一个事件,该事件发生在程序运行时. 异常会影响程序的连续性,使程序中断.在Java中,一切皆对象,所以要定义异常,也需要使用对象.异常对象里 封装了异常类型和程序发生异常时的状态. 我们经常说的抛出异常就是创建异常对象,并提交给运行系统. 异常捕获机制与try-catch 当异常

  • Go语言算法之寻找数组第二大元素的方法

    本文实例讲述了Go语言算法之寻找数组第二大元素的方法.分享给大家供大家参考.具体如下: 该算法的原理是,在遍历数组的时,始终记录当前最大的元素和第二大的元素.示例代码如下: 复制代码 代码如下: package demo01    import (      "fmt"  )    func NumberTestBase() {      fmt.Println("This is NumberTestBase")        nums := []int{12, 2

  • PHP语言对接抖音快手小红书视频/图片去水印API接口源码

    以下为PHP语言调用去水印接口的示例,分别展示GET请求方式和POST请求方式的调用方式.示例代码中用到的userId和secretKey请前往开发者接口管理中心获取. 接口文档:https://jx.henghengmao.com/page/apidoc GET请求方式调用接口示例: $url = 'https://v.douyin.com/JjEFdHT/'; //请把此处的userId和secretKey换成你自己的 这是GET请求方式 $api = 'https://api.henghe

  • C语言算法金手指摩尔投票法手撕绝大多数问题

    目录 正片开始 概念 优点 算法核心 实现 正片开始 概念 嘛是摩尔投票法?简单来说就是投票法,算法解决的问题是如何在任意多的候选人,选出获得票数最多的那个.常见的算法是扫描一遍选票,也就是遍历,对每个候选人进行统计的选票进行统计. 那我遍历难道不香吗? 这里就要讲一下投票法的过人之处 优点 当执行有序情况时,只要找到中位数,然后检查中位数的个数是否超过选票的一半即可.但是当对象的数目不定时,统计选票可能会执行较长时间,相比原来的时间复杂度 O(n) ,可能需运行 O(n^2) 的时间. 针对无

  • C语言算法打卡回文串验证算法题解

    目录 概念 Leetcode例题: 1.回文串的验证 2.有效回文 3.回文排列 点杀回文排列 点杀回文验证(有效性) 对撞指针 概念 所谓回文串,就是字符串反转以后和原串相同,如 abba 和 lippil.对于回文串还是比较容易去验证的,从字符数组的两端开始向中间靠拢去验证字符是否相等,但这里是否需要考虑字符数组长度的奇偶性呢?其实是不用的,下面一起来看看: Leetcode例题: 1.回文串的验证 2.有效回文 3.回文排列 (1,2题是一样的,合并讲解吧) 点杀回文排列 先讲回文排列吧,

  • C语言算法练习之折半查找的实现

    目录 1. 题目描述 2. 问题分析 3. 算法设计 4. 动图演示 5. 代码实现 6.知识点补充 continue 语句 break 语句 continue语句 和 break语句的区别 7. 问题拓展 1. 题目描述 N 个有序整数数列已放在一维数组中,利用二分查找法查找整数 m 在数组中的位置. 若找到,则输出其下标值:反之,则输出 “ Not be found!”. 2. 问题分析 二分查找法(也叫折半查找)其本质是分治算法的一种. 所谓分治算法是指的分而治之,即将较大规模的问题分解成

随机推荐