为了账号安全,请及时绑定邮箱和手机立即绑定

程序面试算法问题

程序面试算法问题

慕虎7371278 2018-07-31 17:25:22
A,B,C,D,E五个人捕鱼后已凌晨,大家便睡觉。早上A第一个醒来,将鱼均分成五份,把多余的一条鱼扔掉,拿走自己的一份,B第二个醒来,也将鱼均分为五份,把多余的一条鱼扔掉,拿走自己的一份。CDE依次醒来,也按同样的方法拿鱼,问他们合伙至少捕了几条鱼。93131213906在别的地方看到的面试题,自己算是3906,据说答案是3121,完全想不通,求教。
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

/**

     * 设第一个人分鱼时总数为a1,每人人分的k1,有:t1 = 5*k1+1.剩下的鱼为t2 = t1-k1-1;

     * 同理,第二个人鱼时有 t2 = 5*k2+1;

     * 结合以上,得出k1 = (5*k2+1)/4,同时要满足k1,k2为整数.

     * 假设最后每人平分数为k5=t,递归的到k1,就可求出总数

     */

        public static void main(String... args) {

            int k = 1;

            int t = k;

            int i = 0;

            while (i < 5){

                if((t*5+1) % 4 == 0){

                    t = (t*5+1)/4;

                }else {

                    t = ++k;

                    i = 0;

                }

                i++;

            }

            System.out.println(5*t+1);

        }


查看完整回答
反对 回复 2018-08-04
?
慕沐林林

TA贡献2016条经验 获得超9个赞

你算的等于3906是按照 y=(x-1)/5这种方式迭代的吧?题目里面是每个人只是拿走了一份,并不是只留了一份。
考虑每个人分完都拿走了一份,剩下4份,公式应该是 y=4(x-1)/5
暴力代码如下:

function fish() {

    for(var j = 0; j < 10000; j++) {

        if(canSplit(j)) {

            console.log(j);

        }

    }

}


function canSplit(count) {

    for(var i = 0; i < 5;i++) {

        if((count - 1) % 5 === 0) {

            count = (count - 1) * 4 / 5;

        } else {

            return false;

        }

    }

    return true;

}


fish();

10000以内的三个结果是:
3121
6246
9371

查看完整回答
反对 回复 2018-08-04
  • 2 回答
  • 0 关注
  • 833 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信