C++学习--8枚银币

本文探讨如何使用C++解决一个经典问题——八枚银币中找假币。通过天平称重,利用递归策略,可以在最少的比较次数内确定假币及其重量属性。首先将银币分为两组比较,根据结果逐步缩小范围,最终定位假币。程序中关键函数coincheck处理不同比较结果,直至找到假币。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现有八枚银币a b c d e f g h,已知其中一枚是假币,其重量不同于真币,但不知是较轻或较重,如何使用天平以最少的比较次数,决定出哪枚是假币,并得知假币比真币较轻或较重。

分析:可以先取出a,b,c和d,e,f进行比较,如果两者的重量相等,即说明假币在g,h,再分别取出g,h和a(确认为真币)比较,和a不相等的是假币,如果两者重量不一样,即说明g,h是真币,然后取出c和f,比较sum(a,b)和sum(d,e),如果两者相等即说明假币在(c,f),如果不相等,则继续取出银币,直到找到假币为止。

其关系像决策树:

在继续进行判断的情况可以使用递归,当然一直把情况列出来也能获得答案。使用递归需要注意退出递归的条件:

1.天平一直不平衡,需要判断到下标为0的银币

2.天平平衡,则可以判断出假币

3.天平不平衡,但未到下标为0,即可以进行递归

在下面的程序中函数void coincheck(int sum1, int sum2,int index1,int index2)的参数意义分别为:sum1,sum2为当前天平的币重量,index1,index2为从天平取下来的银币下标。

#include<iostream>
#include<array>
int count = 0;//记录次数
std::array<int, 8>coin = { 0 };//硬币
void coincheck(int sum1, int sum2,int index1,int index2)
{
	if (index1 == 0)//需要判断到0枚说明码盘上一直不相等
	{
		count++;
		if (coin[0] == coin[1])//和真币比较
		{
			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值