PHP方法实现1-9数列中添加‘+’,‘-’或',使和为100,并输出数列

rcwg 2018-03-20 原文

PHP方法实现1-9数列中添加‘+’,‘-’或”,使和为100,并输出数列

今天收到个题目:编写一个在1,2,3,4,5,6,7,8,9(顺序不能变)数字之间插入 + 或- 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如 1+2+34-5+67-8+9=100; 
一开始在网上找了好久,发现这个问题是在一篇很火的文章《每个程序员1小时内必须解决的5个编程问题》上的第五题 ,如图: 
这里写图片描述 
提供一个php的解决方法,如下:

$str = '123456789';
$newStr = '';
function listarr($str, $newStr)
{
    if(strlen($str) == 1){
        $newStr = $newStr.'9';//最后一位9需要手动加上;
        $v = eval("return $newStr"); //计算公式的结果;
        if($v == 100){
            echo $newStr."<hr/>";
        }
    } else {
        $newStr .= substr($str, 0, 1);
        $str = substr($str,1);
        //递归三种可能
        listarr($str, $newStr.'+');
        listarr($str, $newStr.'-');
        listarr($str, $newStr);
    }
}
listarr($str, $newStr);

 

但是要注意,在求和的时候使用的是eval函数,这个函数是非常非常危险的,很多人都说木马就是利用eval函数,所以基本上所有的服务器都会禁用eval的; 
如果不采用eval函数的话,就需要另外写一个方法手动计算公式的值了:

 1 $str = '123456789';
 2 $newStr = '';
 3 function listarr($str, $newStr)
 4 {
 5     if(strlen($str) == 1){
 6         $newStr = $newStr.'9';//手动加上最后一个9;
 7         $res = cal($newStr);
 8         if($res){
 9             echo $newStr."<hr/>";
10         }
11     } else {
12         $newStr .= substr($str, 0, 1);
13         $str = substr($str, 1);
14 
15         //递归三种可能
16         listarr($str, $newStr.'+');
17         listarr($str, $newStr.'-');
18         listarr($str, $newStr);
19 }
20 function cal($str)
21 {
22     $arr = explode('+', $str);//分割数列,储存至数组中
23     $sum = 0;
24     foreach($arr as $v){
25         if(is_numeric($v)){   //判断分割的数组是否为纯数字;
26             $sum += $v;
27         } else {
28             $vArr = explode('-', $v); //对含减号的数组再进行一次分割;
29             $sum += $vArr[0];   //第一个值前的运算符为+;
30             unset($vArr[0]);
31             $s = array_sum($vArr);
32             $sum -= $s;
33         }
34     }
35     if($sum == 100){
36         return true;
37     } else {
38         return false;
39     }
40 }
41 listarr($str, $newStr);

 

最后补充一个通用模板

 1 /**
 2  * $data array 要计算的数列组合;
 3  * $flag array 可用的运算符号
 4  * $result int 要求的和的值
 5  */
 6 function think_exp($data, $flag, $result)
 7 {
 8     $m = count($data);//m个数字
 9     $n = count($flag);//n个符号
10     $num =  str_split( sprintf ( "%0". ($m - 1) ."d",0) ); //生成一个[0,0,0,0,...,0]的数组
11     $exp = '';
12     while($num != 'Ok' ){
13         $line = '';
14         for ( $i=0; $i<$m; $i++  )  {
15             $line .= $data[$i]; //列出所有的式子;
16             if( isset($num[$i]) ) $line .= $flag[$num[$i]];
17         }
18         if ( eval('return '.$line.';') == $result) {
19             $exp .= $line.'='.$result.'<br />';
20         }
21         $num =  getNext($num , 0, $n);
22     }
23     return $exp;
24 }
25 function getNext($next_num , $position = 0, $n){
26     if ($position == count($next_num)) return 'Ok';
27     $next_num[$position] = $next_num[$position] + 1;
28     if ($next_num[$position] < $n) {
29         return $next_num;
30     } else {
31         $next_num[$position] = 0;
32         return getNext($next_num, $position + 1, $n);
33     }
34 }

 


//计算题目
echo "<font color=red>think_exp(array(1,2,3,4,5,6,7,8,9), array('','+','-','*','/'), 100); </font><br />";
echo think_exp(array(1,2,3,4,5,6,7,8,9), array('','+','-'), 100);
转自Kit_G的博客
发表于 2018-03-20 14:39 一个想全栈的PHP 阅读() 评论() 编辑 收藏

 

版权声明:本文为rcwg原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/rcwg/p/8609170.html

PHP方法实现1-9数列中添加‘+’,‘-’或',使和为100,并输出数列的更多相关文章

  1. linux下如何执行PHP脚本

    Linux 下如何直接执行 php 脚本?下面是部分 php 命令行参数。语法以及参数说明 php [-q] [-h] [-s] [-v] [-i] [-f ] | { [args...]}-q 安静模式,不输出HTTP头-s 将...

  2. 基于科大讯飞AIUI平台自定义语义库的开发

    说明:我写这篇文章的主要目的是因为我在做这块的时候遇到过一些坑,也是希望后来者能少走一些弯路。 科大讯飞AIU […]...

  3. lnmp环境搭建

    本节为 Docker下 Nginx,Mysql,Php 环境搭建 版本:mysql:5.6,nginx,php […]...

  4. 马蜂窝大交通业务质量体系建设初步实践

    马蜂窝大交通业务质量体系建设初步实践 质量是决定产品能否成功、企业能否持续发展的关键因素之一。如何做好质量体系 […]...

  5. yield对性能的提升的一次小小测试

    生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复 […]...

  6. RTMP / RTSP 在线示例视频流记录与直接从视频流中抽取视频帧

      引入:在涉及视频流生成与保存工作,除了自己手动循环播放视频生成视频流之外,还可以借助现在有的一些公开视频流 […]...

  7. PHP标记

    目录 PHP标记风格 从HTML中分离 指令分隔符 当解析一个文件时,PHP 会寻找起始和结束标记,也就是 & […]...

  8. php设计模式-适配器模式

    适配器模式其实也是一种为了解耦的设计模式,为了让客户端的调用变得更简单统一,将源接口转换为目标接口的过程封装到 […]...

随机推荐

  1. TCP Socket Http关系

    TCP Socket Http关系 理解Tomcat内部处理网络数据的机制同时需要了解相关的一些术语,这样我们 […]...

  2. JQuery_九大选择器

    1. 基本选择器 基本选择器是JQuery最常用的选择器,也是最简单的选择器,它通过元素id、class和标签名来查找DOM元素(在网页中id只能使用一次,class允许重复使用)。所谓的网页中id只能使用一次的意思是说,一个网页中的id...

  3. 你真的会写单例模式吗

    作者:DeppWang、原文地址 人生在世,谁不面试。单例模式:一个搞懂不加分,不搞懂减分的知识点 又一篇一抓 […]...

  4. 【POJ – 2376】Cleaning Shifts

    【POJ – 2376】Cleaning Shifts Cleaning Shifts Descr […]...

  5. WINDOWS系统服务详解

    1 WINDOWS系统服务详解    —  WINDOWS系统服务详解 <P>1 Al […]...

  6. 迭代器生成器

    迭代器和生成器 迭代和可迭代 什么是迭代(iteration)? 如果给定一个list或tuple,我们要想访 […]...

  7. ebtables和iptables与linux bridge的交互

    本文为翻译文,不一定是逐字逐句的翻译,而且中间会加上自己的一点见解,如有理解错误的地方,还请大家指出,我定虚心 […]...

  8. 企业的数据管理战略 – FocusBI学院

    企业的数据管理战略 微信公众号:FocusBI 关注可了解更多的商业智能、数据仓库、数据库开发、爬虫知识及沪深 […]...

展开目录

目录导航