找伪币有关问题

求助:找伪币问题
有16个硬币其中一个是假的,重量为9,真币重量为10,找出这个伪币是第几个?
下面程序运行时一闪而过,但将9改在倒数后三个位置时都可以出结果 但改在倒数第四个位置就不行了 不知为什么
void get(int a[],int low,int high)
 {int s,n;
  int i;
  if(a[(low+high)/2]==9)
  printf("%d",(low+high)/2);
  else
  {for(s=0,i=0;i<=(low+high)/2;i++) 
  s=s+a[i];
  for(n=0,i=(low+high)/2+1;i<=high;i++)
  n=n+a[i];
  if(s<n)
  get(a,0,(low+high)/2);
  else
  get(a,(low+high)/2+1,high);}}
main()
{int a[16]={10,10,10,10,10,10,10,10,10,10,10,10,9,10,10,10};
 get(a,0,15);
 while(1);}

------解决方案--------------------
错在这句:
if(s<n)
get(a,0,(low+high)/2);

当发现伪币在前半截时你的程序总是从0位开始扫描,而不是从当前的最低位开始的。
------解决方案--------------------
更改为:

if(s<n)
get(a,low,(low+high)/2);

应该就可以了。
------解决方案--------------------
明白了。。。。那么楼主你的程序应该这样写
C/C++ code
#include <stdio.h>
void get(int a[],int low,int high)
 {
    int s,n;
      int i;
      //if(a[(low+high)/2]==9)
      if(low == high)
          printf("%d",(low+high)/2);
      else
      {
          for(s=0,i=low;i<=(low+high)/2;i++)
              s=s+a[i];
          for(n=0,i=(low+high)/2+1;i<=high;i++)
              n=n+a[i];
          if(s<n)
              get(a,low,(low+high)/2);
          else
              get(a,(low+high)/2+1,high);
      }
}
int main()
{
    int a[16]={10,10,10,10,10,10,10,10,10,10,10,9,10,10,10,10};
    get(a,0,15);
    while(1);
}

------解决方案--------------------
C/C++ code
#include <stdio.h>
void get(int a[],int low,int high)
 {
    int s,n;
      int i;
      //if(a[(low+high)/2]==9)你这个有点牵强
      if(low == high)//当这两个相等的时候,证明就是那个假币了
          printf("%d",(low+high)/2);
      else
      {
          for(s=0,i=low;i<=(low+high)/2;i++)//这儿每次不应该是0,应该是low
              s=s+a[i];
          for(n=0,i=(low+high)/2+1;i<=high;i++)
              n=n+a[i];
          if(s<n)
              get(a,low,(low+high)/2);//这个也是,是从小的开始,但并不一定是0
          else
              get(a,(low+high)/2+1,high);
      }
}
int main()
{
    int a[16]={10,10,10,10,10,10,10,10,10,10,10,9,10,10,10,10};
    get(a,0,15);
    while(1);
}

------解决方案--------------------
if(low == high)
printf("%d",(low+high)/2);

这个,呵呵。。。典型的照搬失误了。

楼主可以看看7楼的代码,看看按格式书写后给阅读带来的方便。任何一个程序员都不该写出无格式的代码来,那回给后续的阅读/修改带来无穷问题。