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

/*
时间限制: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)); // 3
console.log(appleNum(3)); // 25
console.log(appleNum(5)); // 3121
console.log(appleNum(8)); // 16777209

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值