6月份看到的五道题,自己做了下,感觉有点意思,前四个很简单,最后一个有点难,用了笨办法做出来了
//1、使用for循环、while循环和递归写出3个函数来计算给定数列的总和。
echo '1 - <br>';
$str='1,5,6,8,9,4,2';
echo "<pre>";
print_r(fun1($str));
echo "</pre>";
function fun1($str){
$arr=explode(',',$str);
$count=count($arr);
$numfor=$numwhile=$numdeep=0;
for($i=0;$i<$count;$i++){
$numfor+=$arr[$i];
}
$return['numfor']=$numfor;
$w=0;
while($w<$count){
$numwhile+=$arr[$w];
$w++;
}
$return['numwhile']=$numwhile;
$return['numdeep']=numdeep($arr,$count);
return $return;
}
function numdeep($arr,$count){
static $num;
if($count>=0){
$num+=@$arr[$count];
numdeep($arr,--$count);
}
return $num;
}
//2、编写一个交错合并列表元素的函数。例如:给定的两个列表为[a,B,C]和[1,2,3],函数返回[a,1,B,2,C,3]。
echo '2 - <br>';
$arr1=array('a','B','C');
$arr2=array(1,2,3);
echo "<pre>";
print_r(fun2($arr1,$arr2));
echo "</pre>";
function fun2($arr1,$arr2){
$new=array();
$count=count($arr1);
for($i=0;$i<$count;$i++){
$new[]=$arr1[$i];
$new[]=$arr2[$i];
}
return $new;
}
//3、编写一个计算前100位斐波那契数的函数。根据定义,斐波那契序列的前两位数字是0和1,随后的每个数字是前两个数字的和。例如,前
10位斐波那契数为:0,1,1,2,3,5,8,13,21,34。
echo '3 - <br>';
fun3();
function fun3(){
$num=100;
$arr=array(0,1);
for($i=0;$i<$num;$i++){
$count=count($arr);
if($arr[$count-1]>=$num){
unset($arr[$count-1]);
break;
}elseif($count==2){
$arr[]=1;
}else{
$arr[]=$arr[$count-1]+$arr[$count-2];
}
}
echo join(',',$arr).' <br>';
}
//4、编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[50,2,1,9],最大数字为95021。
echo '4 - <br>';
fun4();
function fun4(){
$arr=array(50,2,1,9);
$count=count($arr);
$new=array();
foreach($arr as $k=>$v){
$new[]=substr($v,0,1);
}
arsort($new);
$str='';
foreach($new as $k=>$v){
$str.=$arr[$k];
}
echo $str;
}
//5、编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。
//例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。
fun5();
function fun5(){
$arr=array(1,2,3,4,5,6,7,8,9);//8
$t=array('+','-','');//3^8
$may=array();
$countt=count($t);
for($a=0;$a<$countt;$a++){
for($b=0;$b<$countt;$b++){
for($c=0;$c<$countt;$c++){
for($d=0;$d<$countt;$d++){
for($e=0;$e<$countt;$e++){
for($f=0;$f<$countt;$f++){
for($g=0;$g<$countt;$g++){
for($h=0;$h<$countt;$h++){
$str = "1$t[$a]2$t[$b]3$t[$c]4$t[$d]5$t[$e]6$t[$f]
7$t[$g]8$t[$h]9";
// $may[]=$str;
$tmpnum = '';
eval("\$tmpnum=1$t[$a]2$t[$b]3$t[$c]4$t[$d]5$t[$e]
6$t[$f]7$t[$g]8$t[$h]9;");
if($tmpnum==100){
$may[]=$str.' = 100';
}
}
}
}
}
}
}
}
}
echo "<pre>";
print_r($may);
echo "</pre>";
}
第五题,之前就想过要用递归实现,一直没想到,今天看到有人用js 实现了,照着 copy 份 php的实现方法
$str='1,2,3,4,5,6,7,8,9';
$data = [];
fun5($str,'');
function fun5($str,$pre){
global $data;
$a = explode(',',$str);
$t = str_replace(',','',$str);
if(strlen($t)==2){
$data[] = $pre.(join('+',$a));
$data[] = $pre.(join('-',$a));
$data[] = $pre.$t;
}else{
$c = $a[0];
unset($a[0]);
$s = join(',',$a);
fun5($s, $pre.$c.'+');
fun5($s, $pre.$c.'-');
fun5($s, $pre.$c);
}
}
foreach($data as $k=>$v){
eval("\$num = $v;");
if($num==100){
echo $v.' = 100<br>';
}
}
附上js 的解题方法
var str = "123456789";
var ways = [];
function exec(str, pre) {
var a = str.split("");
if( str.length === 2 ){
ways.push( pre + a.join("+") );
ways.push( pre + a.join("-") );
ways.push( pre + str );
}else{
var c = str.charAt(0),
s = str.substring(1);
exec( s, pre + c + "+" );
exec( s, pre + c + "-" );
exec( s, pre + c );
}
}
exec( str, "" );
for (var i = 0; i < ways.length; i++) {
if( eval( ways[i] ) === 100 ){
console.log( ways[i] + " = 100" );
}
};