找伪币有关问题
求助:找伪币问题
有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);
应该就可以了。
------解决方案--------------------
明白了。。。。那么楼主你的程序应该这样写
有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楼的代码,看看按格式书写后给阅读带来的方便。任何一个程序员都不该写出无格式的代码来,那回给后续的阅读/修改带来无穷问题。