1. 程式人生 > >面試題:1000瓶水其中有一瓶水有毒,有10只老鼠並且只要老鼠喝了有毒的水必死。請問怎樣通過一次實驗找出有毒的那瓶水。

面試題:1000瓶水其中有一瓶水有毒,有10只老鼠並且只要老鼠喝了有毒的水必死。請問怎樣通過一次實驗找出有毒的那瓶水。

import java.util.Arrays;
import java.lang.StringBuilder;
import java.util.Scanner;

public class toxicWater {
	public static final int waterNumber = 1000;//水的數目
	public static final int mouseNumber = 10;//老鼠的數目
	
	public static void main(String args[]){
		int water[] = new int[waterNumber];
		int mouse[] = new int[mouseNumber];
		int i,j;
		String s;
		StringBuffer sb;
		int flag = 1;
		
		Scanner reader = new Scanner(System.in);
//		System.out.println("請輸入老鼠的存活情況,1 表示死了,0表示還活著:");
		for( i=0; i<mouseNumber; i++){
			System.out.println("請輸入第"+i+"老鼠的存活情況(1 表示死了,0表示還活著)");
			mouse[i] = reader.nextInt();
		}
		for( i=0; i<mouseNumber; i++ ){//mouseNumber只老鼠
			for( j=0; j<waterNumber; j++ ){//1000瓶水
				s = Long.toBinaryString(j);//將 j 轉換為二進位制
				sb = new StringBuffer(s);
				sb.reverse();//將字串反轉
				if( sb.length() >= i+1 ){//字串長度
					if( mouse[i] == 1 ){//老鼠死了
						if( sb.charAt(i) == '1'){//第i只老鼠喝了第j瓶水
							water[j]--;
						}
					}
					else{//老鼠未死
						if( sb.charAt(i) == '1'){
							water[j]++;
						}
					}
				}
			}
		}
		int min = 0;
		for( i=0; i<waterNumber; i++ ){//找出數值最小的water
			if( water[i] < min ){
				min = water[i];
				flag = i;
			}
		}
		if( min < 0 ){
			System.out.println("第瓶"+flag+"瓶水有毒!!!");
		}
		else{
			System.out.println("第瓶0瓶水有毒!!!");
		}
	}
}