您的位置:首页 > 其它

分治算法解决硬币轻重问题

2018-03-07 14:10 232 查看

带子里面有若干个硬币 其中一枚是假币,并且假币和真币一模一样 肉眼很难分辨 目前只知道假币比真币的重量轻 请问如何分出真假币

import java.util.Scanner;

public class Demo04 {
  static final int MAXNUM=30;
  static int FalseCoin(int coin[],int low,int high)
  {
  int i,sum1,sum2,sum3;
  int re=0;
  sum1=sum2=sum3=0;
  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;
  }
  }
  return re;
  }
  public static void main(String[] args) {
int [] coin =new int [MAXNUM];
int i,n;
int weizhi;
System.out.println("分治算法解决假币问题!");
System.out.println("请输入硬币总的个数:");
Scanner in =new Scanner(System.in);
n=in.nextInt();
System.out.println("请输入硬币的真假:");
for(i=0;i<n;i++)
{
coin[i]=in.nextInt();
}
weizhi=FalseCoin(coin, 0, n-1);
System.out.println("在上述"+MAXNUM+"个硬币中,第"+weizhi+"个硬币是假的!");
}
}
正硬币为2假硬币为1;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: