C语言每日一练
2021年11月19日

文章目录

  • 题目描述
  • 分析
  • 代码实现
  • 运行结果
  • 网上参考

题目描述

甲、乙、丙三位渔夫出海打鱼,他们随船带了21只箩筐。当晚返航时,他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐则是空的,由于他们没有秤,只好通过目测认为7个满筐鱼的重量是相等的,7个半筐鱼的重量是相等的。在不将鱼倒出来的前提下,怎样将鱼平分为3份?

分析

这题还有两个隐形要求:三个人分得的箩筐数量相同(7只);列出所有的平分方法。

我的思路(参照网上他人方法)
首先,所有的鱼所占的箩筐数为7+7*0.5=10.5只(7只满筐和7只半筐),将它们平分成3份,那么每个人就能分到3.5只装满鱼的箩筐(例如3只满筐和1只半筐或者1只满筐5只半筐等等)。

我们可以先遍历出分到的装满鱼的箩筐数,然后再遍历出分到的装满鱼的箩筐数,的满筐鱼箩筐数则为7-甲乙的满筐鱼的箩筐数之和。由于最后每个人都能分到3.5筐鱼,所以他们最多可分配3只装满鱼的箩筐。

确定完他们的满筐鱼箩筐数之后,接着遍历甲乙分到的半筐鱼箩筐数,分到的半筐鱼箩筐数则等于7-甲乙的半筐鱼的箩筐数之和。由于目前他们分到的满筐鱼的箩筐数为整数,而最终他们都必须分得3.5筐鱼,所以每个人至少要分到一只装有半筐鱼的箩筐,且一定是奇数只

在分配完半筐鱼的箩筐后,如果每个人所分到的鱼的箩筐数为3.5(其实判断甲乙即可),那么说明该分配方式符合条件

最后,每个人空筐的箩筐数=7-该人的满筐鱼箩筐数-该人的半筐鱼箩筐数

我的代码还有一些可优化的地方(可以删去一些无效的循环次数),在网上参考部分有一个很不错的例子(我的思路和代码就参考了该例子)。

代码实现

#include <stdio.h>int main()
{//甲乙丙分得的不同类型箩筐数量int fish_nums[3][3] = {0};int i = 0, j = 0, k = 0, m = 0, n = 0;//甲分满箩筐,最大3筐for(i = 0; i <= 3; i++){fish_nums[0][0] = i; //甲分得满箩筐数//乙分满箩筐,最大三筐for(j = 0; j <= 3; j++){fish_nums[1][0] = j;         //乙分得满箩筐数fish_nums[2][0] = 7 - i - j; //丙分得满箩筐数if(fish_nums[2][0] > 3)continue;                //超过3.5框//甲分奇数个半箩筐,最少1个,最多5个(其他人也要分)for(k = 1; k <= 5; k+=2){if(fish_nums[0][0] + 0.5 * k == 3.5)break;}fish_nums[0][1] = k;         //甲分得半箩筐数//乙分奇数个半箩筐,最少1个,最多5个(其他人也要分)for(m = 1; m <= 5; m+=2)     //乙分奇数个半箩筐{if(fish_nums[1][0] + 0.5 * m == 3.5)break;}fish_nums[1][1] = m;         //乙分得半箩筐数fish_nums[2][1] = 7 - k - m; //丙分得半箩筐数//甲分得空箩筐数fish_nums[0][2] = 7 - fish_nums[0][0] - fish_nums[0][1];//乙分得空箩筐数fish_nums[1][2] = 7 - fish_nums[1][0] - fish_nums[1][1];//丙分得空箩筐数fish_nums[2][2] = 7 - fish_nums[2][0] - fish_nums[2][1];//打印匹配的结果for(n = 0; n < 3; n++){if(n == 0)printf("甲——");else if(n == 1)printf("乙——");else printf("丙——");printf("满筐:%d,半筐:%d,空筐:%d\n", fish_nums[n][0],\fish_nums[n][1], fish_nums[n][2]);if(n == 2)printf("-------------------------------------\n");}}}return 0;
}

运行结果

由于我考虑了针对甲乙丙三个不同的人的分法,所以最后结果有6个,如果不考虑三个人的身份,那么分法还需要除以3,即只有2种(具体代码可以参考下文的网上参考部分)

网上参考

原文链接:http://c.biancheng.net/cpp/html/3370.html

核心思路
(1) 数组的每行或每列的元素之和都为7。
(2) 对数组的行来说,满筐数加半筐数=3.5。
(3) 每个人所得的满筐数不能超过3筐。
(4) 每个人都必须至少有1个半筐,且半筐数一定为奇数。

#include<stdio.h>
int a[3][3], count;
int main()
{int i, j, k, m, n, flag;printf("It exists possible distribtion plans:\n");for(i=0; i<=3; i++)  /*试探第一个人满筐a[0][0]的值,满筐数不能>3*/{a[0][0]=i;for(j=i; j<=7-i&&j<=3; j++)  /*试探第二个人满筐a[1][0]的值,满筐数不能>3*/{a[1][0]=j;if((a[2][0]=7-j-a[0][0])>3)continue;  /*第三个人满筐数不能>3*/if(a[2][0]<a[1][0])break;  /*要求后一个人分的满筐数大于等于前一个人,以排除重复情况*/for(k=1; k<=5; k+=2)  /*试探半筐a[0][1]的值,半筐数为奇数*/{a[0][1]=k;for(m=1; m<7-k; m+=2)  /*试探半筐a[1][1]的值,半筐数为奇数*/{a[1][1]=m;a[2][1]=7-k-m;/*判断每个人分到的鱼是 3.5筐,flag为满足题意的标记变量*/for(flag=1,n=0; flag&&n<3; n++)if(a[n][0]+a[n][1]<7&&a[n][0]*2+a[n][1] == 7)a[n][2]=7-a[n][0]-a[n][1];  /*计算应得到的空筐数量*/elseflag=0;  /*不符合题意则置标记为0*/if(flag){++count;printf("No.%d Full basket Semi-basket Empty\n", count);for(n=0; n<3; n++)printf(" fisher %c: %d %d %d\n",'A'+n, a[n][0], a[n][1], a[n][2]);}}}}}return 0;
}

原文结果:

C语言每日一练——第60天:平分7筐鱼相关推荐

  1. 6 获取数组中最小值_C语言每日一练8——数组中最大值和最小值

    题目: 利用指针函数,求某数组中的最大值和最小值. 实现代码: /* ================================================================= ...

  2. C语言每日一练——第85天:三色球问题

    C语言每日一练 2022年3月8日 文章目录 题目描述 问题分析 代码实现 运行结果 网上参考 题目描述 一个口袋中放有12个球,已知其中3个是红的,3个是白的,6个是黑的,现从中任取8个,问共有多少 ...

  3. C语言每日一练——第73天:谁是窃贼问题

    C语言每日一练 202年1月8日 文章目录 题目描述 问题分析 代码实现 运行结果 网上参考 题目描述 警察审问4名窃贼嫌疑犯.现在已知,这4人当中仅有一名是窃贼,还知道这4个人中的每个人要么是诚实的 ...

  4. C语言每日一练——第35天:打印菱形

    C语言每日一练 2021年10月13日 题目描述 输入菱形的高度n(必须为奇数),即正中间星号的个数,打印出用星号组成的菱形 分析 要打印菱形,先要构想要打印的图形样子,就比如下图这种: 我们可以根据 ...

  5. C语言每日一练——第28天:要求输出国际象棋棋盘

    C语言每日一练 2021年10月6日 题目描述 要求输出国际象棋棋盘 分析 先看看国际象棋的棋盘的长相: 可以看出,国际象棋棋盘呈正方形,里面包含8x8总共64个小方格,它们黑白相间.要想在控制台输出 ...

  6. C语言每日一练——第10天:求一个矩阵主对角线及副对角线元素之和

    C语言每日一练 2021年9月18日 题目描述 求一个矩阵主对角线及副对角线元素之和 分析 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,矩阵是高等代数学中的常见工具,也常见于 ...

  7. C语言每日一练——第1天:字母大小写转换

    C语言每日一练 2021年9月9日 本人C语言菜鸟,最近工作中频频出现C语言小错误,遂决定使用笨方法提高我的C语言水平,坚持每天一个C语言小练习,养成C语言手感,从此让编程成为习惯. 题目描述 从键盘 ...

  8. 【C语言每日一练——第1练:字母大小写转换】

    C语言每日一练 2022年6月13日 题目描述 从键盘输入一个大写字母,要求改用小写字母输出 分析 从键盘输入可以使用scanf或getchar等函数. 大写字母是一个字符,字符类型数据在C语言中是以 ...

  9. C语言每日一练——第80天:换分币问题

    C语言每日一练 2022年2月13日 文章目录 题目描述 问题分析 代码实现 运行结果 题目描述 将5元的人民币兑换成1元.5角和1角的硬币,共有多少种不同的兑换方法. 问题分析 列举3元1次方程 1 ...

最新文章

  1. Java中的static———静态变量
  2. python标准词匹配_用 Python 自动化办公能做到哪些有趣或有用的事情?
  3. weka 学习总结(持续)
  4. poi 操作excel的处理
  5. 东软是如何看待“人与资产”管理的转型
  6. Oracle中的位运算以及推导公式
  7. 选好电线 “家”倍安全
  8. 2019-3-5 梦
  9. 智能人物画像综合分析系统——Day7
  10. 2017、2018年JS面试题记录分享
  11. 机器学习(八):样本分布不均衡问题的处理
  12. 携程集团招股说明书-港股
  13. Faiss相似性搜索类库
  14. html存储数据的方法,数据存储方式有哪些
  15. 机器学习中Batch Size、Iteration和Epoch的概念
  16. JZ·7.8.2019
  17. iPhone X适配之启动图适配教程
  18. 解决vue+element 时间控件时间差,区域时差8小时
  19. 使用mysql Installer安装失败处理办法
  20. 使用library(tseries)命令,报错“Error in library(tseries) : there is no package called ‘tseries’

热门文章

  1. spring部分解析
  2. 诺贝尔物理学奖与信息通信技术发展
  3. 高并发高可用复杂系统中的缓存架构(十六) 实现缓存与数据库双写一致性保障方案
  4. 计算机当前系统时间格式,类型:系统设置篡改-系统时间或日期不正确说明:当前系统时间与时区不符...
  5. uniapp webview 直接调用原生摄像头拍照 拍视频 img video,通过ajax获取blob(file为特殊的blob)对象并上传到后端服务器
  6. 微信小程序---全局分享实现
  7. 消防工程师 第一篇 消防基础知识 2.火灾
  8. sql 统计和分类
  9. 如何让外网访问你的电脑
  10. M1芯片Mac无法安装ES 6.x解决方案