假设有9个球和一个天平,其中一个稍微重一些,那么至少要多少次可以找到这个较重的球,并指出较重球的编号。
// BallWeigh.cpp : 定义控制台应用程序的入口点。
/* 时间:2014-3-31
* 作者: Lily Wu
* 功能:实现小球称重
* 思路:首先对小球的重量存在数组中,然后把数组元素分ABC三组,通过比较其中两个数组和的大小来判断重球在哪组中,并对该组重复操作。
*/
#include "stdafx.h"
#include <iostream>
using namespace std;
int BallWeigh(int weigh[],int num);
static int count = 0;
int main()
{
//存储小球的重量
int a[] = {1,1,1,1,2,1,1,1,1};
int num;
num = BallWeigh(a,9);
cout << "第"<<num<<"个球较重"<<endl;
cout << "最少需要称"<<count << "次"<< endl;
return 0;
}
int BallWeigh(int weigh[],int num)
{
count ++;
int index;
// 分成三组
int num1 = num/3;
int arrary1 = 0;
int arrary2 = 0;
int arrary3 = 0;
int temp;
int i = 0;
// 求各组小球的质量和
for( i = 0; i < num1 ; i ++)
{
arrary1 += weigh[i];
arrary2 += weigh[i + num1];
arrary3 += weigh[num - 2*num1]; //数组的长度必须是常量或常量表达式,不能为动态变量
}
int *arrary = new int[num1];
// 比较确定较重小球在哪组 当arrary1 = arrary2时,说明在arrary3中
if(arrary1 > arrary2)
{
temp = 0;
}
else if(arrary1 == arrary2)
{
temp = 2;
}
else
{
temp = 1;
}
// 如果每组元素为1个,则直接输出元素号码 这个为递归结束条件
if(num1 == 1)
index = 1 + temp;
// 把较重组的元素存入新的数组中,以便下次递归使用
else
{
for(i = 0;i < num1;i++)
{
arrary[i] = weigh[i + temp*num1];
}
index = BallWeigh(arrary,num1) + temp*num1;
}
delete[] arrary;
return index;
}