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. CI 框架源码解析一之入口文件 index.php

     Index.php作为CI框架的入口文件,源码分析,自然而然由此开始。在源码分析的过程中,我们并不会逐行进行 […]...

  2. PHP怎样使用

    ● PHP的标签php使用标签,实际演示:1 输出:hello!● 在HTML中引入PHP直接在html文档中嵌入PHP直接使用<?php...

  3. C、C++、Java、JavaScript、PHP、Python有啥区别,终于搞清楚了 – cq指尖代码

    C、C++、Java、JavaScript、PHP、Python有啥区别,终于搞清楚了 c语言主要用于底层和驱 […]...

  4. php 实现店铺装修4

    /** * @title 发布装修的店铺 * @example FlagShipShopDecorate.fa […]...

  5. php 公众号开发

    思考: 1,优先使用php扩展库的sdk,配合微信文档。 2,公众号开发比较简单,重在业务。 公众号关联与消息 […]...

  6. 五十个小技巧提高PHP执行效率,解决三大常见问题

    在项目开发过程中,经常遇到了一些PHP处理程序性能底下的情况,程序运行在centos+nginx环境,虽然这个 […]...

  7. 一种laravel特有的serviceProvider的加载方式

    一种laravel特有的serviceProvider的加载方式 2018-01-08 17:04 by 轩脉 […]...

  8. PHP composer 日常使用命令和理解

    composer的操作很多很杂,平时大都用不上,正要找又一时半会难找到 日常操作,走起 第一部分 : 安装 c […]...

随机推荐

  1. ASP.NET Core WebAPI中使用JWT Bearer认证和授权

    目录 为什么是 JWT Bearer 什么是 JWT JWT 的优缺点 在 WebAPI 中使用 JWT 认证 […]...

  2. 尾递归实现斐波那契数列

      一、斐波那契数列 斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34 […]...

  3. 使用cwRsync实现windows下文件定时同步(备份)

    cwRsync,软件分为服务器端/客户端,用于同步或备份文件,本文介绍如何用最简单的方式配置同步信息,并创建定 […]...

  4. 上传图片,点击更换

        做这种效果:   imgUrl判断显示那个样式 ``` <el-form-item label= […]...

  5. 微信小程序实现简单的2048

      这两天心血来潮,用微信小程序写了一个简单的2048,欢迎各位老铁围观,提出宝贵意见。这里我从0到1赘述一下 […]...

  6. “与未来同行”线上开年演讲特别版,开启预约

    今天结束,2020就过完了。 写完无数年终总结,也终于抽空好好想想, 自己的2020怎么样 VS 2021有什 […]...

  7. easyui-layout 布局自适应

    最近在把以前写的一个项目改成用easyui做前端。过程中遇到了不少问。其中一个就是datagrid不能很好的布 […]...

  8. 打造一个上传图片到图床利器的插件(Mac版 开源)

    写markdown博客如何将截图快速上传到图床——记一个工具插件的实现(windows版 开源)(2017-0 […]...

展开目录

目录导航