阿里巴巴面试题



/**
 * 阿里巴巴面试题
 * 有一堆石子共100枚,甲乙轮流从该堆中取石子,每次可以取2、4或6枚,取得最后的石子的玩家为赢家,若甲先取,则:
 *   A 谁都无法必胜
 *   B 乙必胜 
 *   C 甲必胜
 *   D 不确定
 *   闲来蛋疼就做这道题试试       思路分析
 * 假设每人都只能取2枚,那么一共可以取50次,所以甲先取的话,那么最后一次必然是乙
 * 同理,若每次只能取4枚,那么一共可以取25次,所以甲先取,最后一次必然是甲,但是若每次取6枚的话,那么就不能整除,
 * 所以,此题难在关键不确定每次甲或乙会取几个,但是我们可以看到一个共性,如果取石子的次数是奇数的话,那么必然是甲胜,若取石子
 * 的次数是偶数的话,那么必然是乙胜,看看每次甲和乙取石子的组合有哪些:
 *首先,甲每次有三种选择,乙也每次有三种选择,所以一共是3*3=9种选择
 * A:甲 2 乙 2 和是 4
 * B:甲 2 乙 4 和是 6 或者 甲 4 乙 2 和是 6
 * C:甲 2 乙 6 和是 8 或者 甲 6 乙 2 和是 8
 * D:甲 4 乙 4 和是 8
 * E:甲 4 乙 6 和是10 或者 甲 6 乙 4 和是 10
 * F:甲 6 乙 6 和是 12
 *由上分析可以看出 100/4=25可以整除,100/6=16余4,100/8=12余4,100/10=10可以整除,100/12=8余4
 *所以我们假设甲先取4个,那么剩下96个,因为96是8的倍数,所以无论乙取几个,甲只要取(8-乙取的)个石子,就必然能保证96/8=12,最后必然是甲胜
 *同理我们再次假设甲先取2个,那么剩下98个,不能整除8,余2,所以最后一次是乙取,所以必是乙胜
 *我们再假设甲先取6个,那么剩下94个,不能整除8,余6,所以不确定是甲胜还是乙胜,因为最后剩下的6个乙可以取完,也可以不取完,完全看乙的选择而定,所以选A
 */
//以下程序测试在甲先取4个的情况
public class AliBabaTest {
public static void main(String[] args) {
int numOfA;//表示甲取的个数
int numOfB;//表示乙取的个数
int num = 96;//表示甲先取4个之后,剩余的石子总数
int count = 1;//计数器
while(num!=0){
int random = (int) (3*Math.random());//[0,1),[0,3)
//random产生的随机数,每次都是0、1或2,如果是0,那么就假设乙取2个,如果是1就假设乙取4个,如果是2就假设乙取6个
if(random==0){
numOfB = 2;
numOfA = 8-numOfB;
num -= 8;
System.out.println("第"+count+"轮-->"+"乙取了:"+numOfB+"个石子,甲取了:"+numOfA+"个石子");
count++;
}else if(random==1){
numOfB = 4;
numOfA = 8-numOfB;
num-=8;
System.out.println("第"+count+"轮-->"+"乙取了:"+numOfB+"个石子,甲取了:"+numOfA+"个石子");
count++;
}else if(random==2){
numOfB = 6;
numOfA = 8-numOfB;
num -= 8;
System.out.println("第"+count+"轮-->"+"乙取了:"+numOfB+"个石子,甲取了:"+numOfA+"个石子");
count++;
}else{
System.out.println("随机数产生错误...");
}
}
System.out.println("甲获得了胜利...");
}
}
/**
 * 以下是某次的运行结果:
第1轮-->乙取了:6个石子,甲取了:2个石子
第2轮-->乙取了:2个石子,甲取了:6个石子
第3轮-->乙取了:6个石子,甲取了:2个石子
第4轮-->乙取了:2个石子,甲取了:6个石子
第5轮-->乙取了:4个石子,甲取了:4个石子
第6轮-->乙取了:6个石子,甲取了:2个石子
第7轮-->乙取了:4个石子,甲取了:4个石子
第8轮-->乙取了:6个石子,甲取了:2个石子
第9轮-->乙取了:6个石子,甲取了:2个石子
第10轮-->乙取了:2个石子,甲取了:6个石子
第11轮-->乙取了:6个石子,甲取了:2个石子
第12轮-->乙取了:2个石子,甲取了:6个石子
甲获得了胜利...
 */ 


//此题剩下的最大疑问点就是为什么选择了8(指的是每次甲乙一轮取得石子数之和)这个神奇的数字,这是因为8是比6大的最小的偶数,假设选择的数比6小,那么乙取了6个之后,甲就没办法取了,
//又假设选择的数比8大,那么乙取了2个之后,甲最大也只能取6,所以一样没办法取了
//若有遗漏之处,还望补充

posted on 2013-09-26 22:06  you Richer  阅读(463)  评论(0编辑  收藏  举报