+ -
当前位置:首页 → 问答吧 → 请教个问题。。(古典称球问题)

请教个问题。。(古典称球问题)

时间:2011-12-05

来源:互联网

//称球问题:12个外形相同的圆球,其中一个是次品,不知其轻重,其他11个球重量相同; 
//有一天平,没有砝码; 
//请用最快的方法找出次球。 
#include<iostream>
using namespace std;
int a[12];//12个球的重量 
int weight(int i,int j){ //第i个到第j个的重量和 
  int w=0;
  for(int k=i;k<=j;k++) w+=a[k];
  return w;
  }
void chengqiu(int a[]){
  if(weight(0,3)==weight(4,7)){
  if(weight(0,1)==weight(8,9)){
  if(weight(0,0)==weight(10,10))
  cout<<"11";
  else cout<<"10";
  }
  else if(weight(0,0)==weight(8,8))
  cout<<"9";
  else cout<<"8";
  }
  else if(weight(0,3)==weight(8,11)){
  if(weight(4,5)==weight(8,9)){
  if(weight(6,6)==weight(8,8))
  cout<<"7";
  else cout<<"6";
  }
  else if(weight(4,4)==weight(8,8))
  cout<<"5";
  else cout<<"4";
  }
  else if(weight(0,1)==weight(8,9)){
  if(weight(2,2)==weight(8,8))
  cout<<"3";
  else cout<<"2";
  }  
  else if(weight(0,0)==weight(8,8))
  cout<<"1";
  else cout<<"0";
   
  } 
int main(){
  int a[12]={1,1,1,1, 1,1,0,1, 1,1,1,1};
  chengqiu(a);
  system("pause");
  }
-------------------------------
这个程序执行结果不对。但稍微改动了一下:
//称球问题:12个外形相同的圆球,其中一个是次品,不知其轻重,其他11个球重量相同; 
//有一天平,没有砝码; 
//请用最快的方法找出次球。 
#include<iostream>
using namespace std;
int a[12]={1,1,1,2,1,1,1,1,1,1,1,1};;//12个球的重量 
int weight(int i,int j){ //第i个到第j个的重量和 
  int w=0;
  for(int k=i;k<=j;k++) w+=a[k];
  return w;
  }
void chengqiu(int a[]){
  …………
  …………  
  } 
int main(){
  chengqiu(a);
  system("pause");
  }
就行了。不知道为什么,感觉还是数组定义的问题,哪位大哥帮小弟一下。 dev编译器编译。

作者: s867097115   发布时间: 2011-12-05

1个和另外的不同,我没仔细看代码
但是如果用到求和,异常重量是0的时候,加了等于没加,可能问题出在这里吧
如果如此,你换任意的非0整数应该都可以

作者: libralibra   发布时间: 2011-12-05

你第一个定义了一个全局变量a[12],系统将自动初始化为0,而后你在main定义了一个局部的a[12],那么你仔细看看weight()函数你会发现weight()函数使用的a[12]是全局变量也就是全部初始化为0的。所以无论你main中的a[12]如何赋值,结果一定是cont<<"0"。
另外你的方法应该不是最快的,我记得应该是3次,而你的是4次。

作者: shw111517   发布时间: 2011-12-06

这题最快是4次,很麻烦

作者: liuxingvcvc   发布时间: 2011-12-06

引用 3 楼 liuxingvcvc 的回复:

这题最快是4次,很麻烦

这题最快是3次,打错了

作者: liuxingvcvc   发布时间: 2011-12-06