八枚银币(Coins)
问题说明:
现在有八枚银币abcdefg,已知其中一枚是假币,其重量不同于真币,但不知道是轻还是重,如何用天平以最小的比较次数决定出那个是假币,并得知假币是比真币轻还是重。
结果:
Java代码:
package com.allen;
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;
public class Coins { private int[] coins;
public Coins() { coins = new int[8]; for(int i = 0; i < 8; i++) coins[i] = 10; }
public void setFake(int weight) { coins[(int) (Math.random() * 7)] = weight; }
public void fake() { 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 void compare(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 void main(String[] args) { if(args.length == 0) { System.out.println("输入假币重量(比10大或小),ex:6"); return; }
Coins eightCoins = new Coins(); eightCoins.setFake(Integer.parseInt(args[0])); eightCoins.fake(); } } |
这里if(args.length == 0)需要设置一下参数: