阿里巴巴面试题



/**
 * 阿里巴巴面试题
 * 有一堆石子共100枚,甲乙轮流从该堆中取石子,每次能够取二、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,因此同样没办法取了
//如有遗漏之处,还望补充

面试