【京东2016研发工程师编程题】分苹果

来源:互联网 发布:windows平板镜像下载 编辑:程序博客网 时间:2024/06/05 15:22
/*时间限制:3秒空间限制:32768K果园里有一堆苹果,一共n头(n大于1小于9)熊来分,第一头为小东,它把苹果均分n份后,多出了一个,它扔掉了这一个,拿走了自己的一份苹果,接着第二头熊重复这一过程,即先均分n份,扔掉一个然后拿走一份,以此类推直到最后一头熊都是这样(最后一头熊扔掉后可以拿走0个,也算是n份均分)。问最初这堆苹果最少有多少个。给定一个整数n,表示熊的个数,返回最初的苹果数。保证有解。测试样例:2返回:3 */function appleNum(n) { // n是熊的个数    var i=1;    var res=n*i+1; // res-1一定是n的整数倍    while (!isMin(n,res)){        res=n*i+1;        i++;    }    return res;}// 判断m是否满足 均分、拿走后剩余苹果依然能够均分// m是总的苹果数function isMin(n,m) {    var next=m; // next表示一只熊走后剩余的苹果,初始值设为m总的苹果数    if(Math.floor((m-1)%n)!==0) // 如果一开始m-1就无法均分,则m不满足题意(20170908update:这句可以不要,因为上面res的取值保证了(res-1)%n一定等于0)        return false;    for(var i=1;i<n;i++){ // 否则,看接下来n-1个熊能否把next-1个苹果均分        next=(next-1)*(n-1)/n; // 本次的苹果总数X[i+1]=X[i]-( X[i]/n + 1 ) ,整理一下有X[i+1]=(X[i]-1)*(n-1)/n        if(Math.floor((next-1)%n)!==0) // 如果后续有一个不能均分,则m不满足题意            return false;    }    return true; // 如果上面的循环完毕,则说明后续的熊都能够均分苹果,m满足题意}console.log(appleNum(2)); // 3console.log(appleNum(3)); // 25console.log(appleNum(5)); // 3121console.log(appleNum(8)); // 16777209

原创粉丝点击