一道面试题

今天在校招的时候看到一个系统组的笔试题还挺有意思的。

题目是:
要求在1-100之间选择五个不同的数,要求五个数的和加起来不能大于100,问有多少种可能,要求过程,不求结果。

我回来想了一下,大体思路是分别求加起来分别为1到99之间的每一个可能的数目,而且最小集合是{1,2,3,4,5},所以只需要计算10-99这89种可能的组合就行,循环实现代码如下:

<?php
for($i=10; $i<100; $i++) {
    $total += get_possible($i);
}
var_dump($total);

function get_possible($num)
{
    $total=0;
    for($key1=1;$key1<$num-10;$key1++) {
        for($key2=$key1+1;$key2<=$num-$key1;$key2++) {
            for($key3=$key2+1;$key3<=$num-$key2-$key1;$key3++) {
                for ($key4=$key3+1;$key4<=$num-$key1-$key2-$key3;$key4++)
                {
                    for ($key5=$key4+1;$key5<=$num-$key1-$key2-$key3-$key4;$key5++) {
                       
                        if($key1+$key2+$key3+$key4+$key5 == $num) {
                            $total++;
                        }
                    }
                }
            }
        }
    }
    return $total;
}

结果:int(455175)

没发现一个学生写出代码有点失望,如果有更好的方法欢迎交流。

  1. 集合{1,2,3,4,5}的和为15,不能大于100既可以等于100,应该求15-100的组合,最后结果为int(480512)
    附上自己的代码
    <?php
    $total=0;
    for($key=1;$key<=100;$key++)
    {
    for($key2=$key+1;$key2<=100;$key2++)
    {
    for($key3=$key2+1;$key3<=100;$key3++)
    {
    for($key4=$key3+1;$key4<=100;$key4++)
    {
    for($key5=$key4+1;$key5<=100;$key5++)
    {
    if($key+$key2+$key3+$key4+$key5<=100){
    $total++;
    }
    }
    }
    }
    }
    }
    var_dump($total);

  2. result = 0
    MAX_SUM = 100
    for i in range(1, MAX_SUM):
    for j in range(i + 1, MAX_SUM):
    for k in range(j + 1, MAX_SUM):
    for p in range(k + 1, MAX_SUM):
    tmp = (MAX_SUM – (i + j + k + p)) // 5
    if tmp > 0:
    result += tmp
    else:
    break
    print(result)
    最后结果是480512

  3. ᯎ送现金ᯎ
    皇家
    万豪娱乐城
    奥林匹克
    五洲国际
    新豪博亚
    乐天娱乐城
    澳门英皇
    1118T。CoM