1、编程求10000之内的所有“完数”。所谓“完数”是指一个数恰好等于它的包括1在内的所有不同因子之和。例如,6是完数,因为6=1+2+3。
2、编程求所有的3位数素数,且该数是对称的。所谓“对称”是指还是一个数,倒过来还是该数。例如,375不是对称数,因为倒过来变成了573。
3、猴子吃桃问题。猴子第1天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了1个。第2天早上又将剩下的桃子吃掉一半,又多吃了1个。以后每天早上都吃了前1天剩下的一半,再多吃1个,到第10天早上想再吃时见只剩下1个桃子了。试编程求,第1天共摘下多少桃子。

解决方案 »

  1.   

    //完数
    $result = [];
    for ($i=3; $i <10001 ; $i++) { //不知道是否考虑1这种特殊情况,而2又明显不符合要求 所以从3开始
        $arr = getFactor($i); //获取$i所有非1和本身因子
        if($arr){ //如果arr不为空
            if(array_sum($arr)+1==$i){ //判断和
                $result[] = $i;
            }
        }
    }
    //获取所有除1和本身之外的所有因子
    function getFactor($num){ 
        $arr = [];
        for ($i=2; $i < $num; $i++) { //不考虑因子为1的情况
            if($i*$i>$num){ //尽量降低循环次数 (因为在$num/$m = $n 中假设$m为min($m,$n),$n最小等于$m,所以$m不会比√$num大)
                break;
            }elseif($num%$i==0){ //如果$i为$num的因子
                $arr[] = $i;
                if($num/$i!=$i){ //$num/$i 也是$num的因子 如果因子$i*$i != $num 则将$num/$i也赋值给$arr
                    $arr[] = $num/$i;
                }
            }
        }
        return $arr;
    }var_export($result);//完数//3位数素数,且该数是对称的
    $result1 = [];
    for ($i=1; $i < 10; $i++) { //因为三位数第一位数字不为0所以从1开始
        for ($j=0; $j < 10; $j++) {  //三位数中间的数字可以取0-9
            $num  = (int)($i.$j.$i); //对称数
            $arr = getFactor($num); //获取对称数中是否有除1以外的因子
            if(!$arr){  //不存在则为质数
                $result1[] = $num;
            }
        }
    }
    var_export($result1);1和2
      

  2.   

    什么错误? php版本多少?
      

  3.   

    完数 简单粗暴 有点不对感觉 $arr = array();
            for($i = 3; $i <= 10000; $i++) {
                $sum = 0;
                for($j = 3; $j <= $i; $j++) {
                    $sum += $j;
                    if($sum == $i) {
                        $arr[] = $i;
                        break;
                    }
                }
            }        var_dump($arr);
      

  4.   

    $arr = array();
            for($i = 3; $i <= 10000; $i++) {
                $sum = 0;
                for($j = 1; $j <= $i; $j++) {
                    $sum += $j;
                    if($sum == $i) {
                        $arr[] = $i;
                        break;
                    }
                }
            }
     
            var_dump($arr);