八枚银币(Coins)
问题说明:
现在有八枚银币abcdefg,已知其中一枚是假币,其重量不同于真币,但不知道是轻还是重,如何用天平以最小的比较次数决定出那个是假币,并得知假币是比真币轻还是重。
结果:

Java代码:
packagecom.allen;
importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStreamReader;
public classCoins { private int[]coins;
publicCoins() { coins=new int[8]; for(int i= 0;i< 8;i++) coins[i] = 10; }
public voidsetFake(int weight) { coins[(int) (Math.random() * 7)] =weight; }
public voidfake() { if(coins[0]+coins[1]+coins[2] == coins[3]+coins[4]+coins[5]) { if(coins[6] >coins[7]) compare(6, 7, 0); else compare(7, 6, 0); } else if(coins[0]+coins[1]+coins[2] > coins[3]+coins[4]+coins[5]) { if(coins[0]+coins[3] ==coins[1]+coins[4]) compare(2, 5, 0); else if(coins[0]+coins[3] >coins[1]+coins[4]) compare(0, 4, 1); if(coins[0]+coins[3] <coins[1]+coins[4]) compare(1, 3, 0); } else if(coins[0]+coins[1]+coins[2] < coins[3]+coins[4]+coins[5]) { if(coins[0]+coins[3] ==coins[1]+coins[4]) compare(5, 2, 0); else if(coins[0]+coins[3] >coins[1]+coins[4]) compare(3, 1, 0); if(coins[0]+coins[3] <coins[1]+coins[4]) compare(4, 0, 1); } }
protected voidcompare(int i,int j,int k) { if(coins[i] >coins[k]) System.out.print("\n假币"+ (i+1) +"较重"); else System.out.print("\n假币"+ (j+1) +"较轻"); }
public static voidmain(String[]args) { if(args.length== 0) { System.out.println("输入假币重量(比10大或小),ex:6"); return; }
CoinseightCoins=newCoins(); eightCoins.setFake(Integer.parseInt(args[0])); eightCoins.fake(); } } |
这里if(args.length== 0)需要设置一下参数:
