五人分鱼

网上看了些算法,找一个理解了一下,做个备忘,仅供参考

问题描述:
A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。

日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。

B 第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉拿走自己的一份。 。

C、D、E依次醒来,也按同样的方法拿鱼。

问他们至少捕了多少条鱼?
思路

一堆鱼,然后A丢掉一只,把剩下的分成5份,A得一份,然后B将剩下的鱼(A拿走一份后剩下的4份总和),也丢掉一只,然后又分成5份,B得一份,依次类推C,D,E
就是每个人丢掉一只,刚好整除5

伪代码分步走
//假设我们有 10 条鱼
fish = 10

//因为有五个人分,所以我们搞个循环
//先搞个临时变量把鱼fish装一下,这个临时变量在for循环里面使用,以免使用fish变量出现覆盖问题
tmp_fish = fish
for _ in range(5): (语法不懂,见标注)
   # 第一个进来,鱼总数是tmp_fish
   # 第一个人得到的鱼就是:(tmp_fish - 1) // 5  
   # 第二个人进来,鱼总数是 ((tmp_fish - 1) // 5 ) * 4  就是第一个人得到的数量乘以4
   # 依次理解下去... 这里就不列举了

   # 
   if (tmp_fish - 1) % 5 == 0:
		tmp_fish = ( (tmp_fish - 1) // 5 ) * 4
	else:
		# 在五次循环里面,如果都满足if的条件,鱼的数量就知道了
		# 如果没有满足,走到else,就表示不满足
		# 这个时候我们就开始假设鱼有 (其他值)
		break
标注

for _ in range(5) 
# range(5) 就不说了(python的一个函数)
# 里面的"_" 表示 不关心每次循环的值,你用个变量i代替也可以,只是在循环体里面没有用到i 所以用了"_"(装逼用)

tmp_fish = ( (tmp_fish - 1) // 5 ) * 4
# 符号"//"(取整除) 与"%"(取模) 配合理解,比如 8除以5 得1,余数为3  那 8//5 的结果就是1  8%5的结果就是3
python代码
# 初次见面,随便假设一个鱼的总数,不要设置太高,以免错过答案
fish = 10

# 这里使用while循环,如果不满足 在依据新假设的鱼总数,再进循环(咱肯定不能总是自己设置一个鱼的数量)
while True:
	# 每次进入while循环,我们需要先暂存一下fish的值,方便在循环里面使用,避免覆盖fish的值
	tmp_fish = fish
	# 每次进入while循环,我们都假设这个数是可以满足条件的
	enough = True
	
	# 开始每次的for循环(每次for循环的任务就是拿我们假设的值 给5个人分以下,看能不能满足要求
	# 如果不满足要求,就把enough设置为False,然后跳出for循环
	# 如果满足要求,enough的值会继续保持为True,for循环走完后,就会跳出while循环,打印结果(也可以直接在while里面打印结果)
	for _ in range(5):
		# 根据要求,鱼必须丢掉一个 并整除5 才能满足要求
		if (tmp_fish - 1) % 5 == 0:
			# 当满足要求时,我们需要计算出下一个人开始分鱼时,鱼的总舒缓亮
			tmp_fish = ( (tmp_fish - 1) / 5 ) * 4
		else:
		    # 如果5次循环,有一次进入这个 ,就表示不满足要求
			enough = False
			break
	
	if enough:
		# 表示假设的值满足要求,所以我们跳出while循环,去打印结果
		break
	else:	
		# 表示假设的值不满足要求,所以我们把假设的值加1,再次循环
		fish += 1

print("鱼的条数:" + str(fish))

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值