分治算法寻找假银币问题(六)

【算法思想】


【示例】


【算法分析】


【源代码】

//只能有一个假银币
#include <stdio.h>
#include <stdlib.h>

#define MAXNUM 30

int FalseCoin(int coin[],int low,int high)
{
	int i, sum1, sum2, sum3;
	int re;

	sum1 = sum2 = sum3 = 0;
	
	//low=0,high=1,银币只有两个
	if (low + 1 == high)
	{
		if (coin[low] < coin[high])
		{
			re = low + 1;
			return re;
		}
		else
		{
			re = high + 1;
			return re;
		}
	}
	//银币数量为偶数
	if ((high - low + 1) % 2 == 0)
	{
		for (i = low; i <= low + (high - low) / 2; i++)//前一半
		{
			sum1 = sum1 + coin[i];
		}
		for (i=low+(high-low)/2+1;i<=high;i++)//后一半
		{
			sum2 = sum2 + coin[i];
		}
		if (sum1 > sum2)//比较前一半和后一半的重量
		{
			re = FalseCoin(coin, low + (high - low) / 2 + 1, high);//递归调用,再把重量轻的分一半
			return re;
		}
		else if (sum1 < sum2)
		{
			re = FalseCoin(coin,low,low+(high-low)/2);
			return re;
		}
		else
		{
		}
	}
	//银币数量为奇数
	else
	{
		for (i=low;i<=low+(high-low)/2-1;i++)
		{
			sum1 = sum1 + coin[i];
		}
		for (i = low + (high - low) / 2 + 1; i <= high; i++)
		{
			sum2 = sum2 + coin[i];
		}
		sum3 = coin[low+(high-low)/2];
		if (sum1 > sum2)
		{
			re = FalseCoin(coin, low + (high - low) / 2 + 1,high);
			return re;
		}
		else if (sum1 < sum2)
		{
			re = FalseCoin(coin,low,low+(high-low)/2-1);
			return re;
		}
		else
		{
		}
		if (sum1 + sum3 == sum2 + sum3)
		{
			re = low + (high - low) / 2 + 1;
			return re;
		}
	}
}
void main()
{
	int coin[MAXNUM];
	int i, n;
	int weizhi;
	printf("分治算法求解假银币问题!\n");
	printf("请输入银币总的个数:");
	scanf("%d", &n);
	printf("请输入银币的真假:");
	for (i = 0; i<n; i++)
	{
		scanf("%d", &coin[i]);
	}
	weizhi = FalseCoin(coin, 0, n - 1);
	printf("在上述%d的银币中,第%d个银币是假的!\n", n, weizhi);
	system("pause");
}
【演示结果】



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值