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

  1. $str = '123456789';
  2. $newStr = '';
  3. function listarr($str, $newStr)
  4. {
  5. if(strlen($str) == 1){
  6. $newStr = $newStr.'9';//最后一位9需要手动加上;
  7. $v = eval("return $newStr;"); //计算公式的结果;
  8. if($v == 100){
  9. echo $newStr."<hr/>";
  10. }
  11. } else {
  12. $newStr .= substr($str, 0, 1);
  13. $str = substr($str,1);
  14. //递归三种可能
  15. listarr($str, $newStr.'+');
  16. listarr($str, $newStr.'-');
  17. listarr($str, $newStr);
  18. }
  19. }
  20. 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. }

  1. //计算题目
  2. echo "<font color=red>think_exp(array(1,2,3,4,5,6,7,8,9), array('','+','-','*','/'), 100); </font><br />";
  3. echo think_exp(array(1,2,3,4,5,6,7,8,9), array('','+','-'), 100);
    转自Kit_G的博客

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

  1. ①创建项目testpackage ②在pack2.B中添加方法f ③在类A中添加如下三个成员变量:int型的私有变量i float型的变量f double型的公有变量d 在pack1.B的main方法中为对象a的成员变量f和d分别赋值为2和3 在pack2.C的main方法中为对象a的成员变量d赋值为3

    package pack1; public class A { private int i; float f; public double d; public float getF() { retur ...

  2. mysql 中添加索引的三种方法

    原文:http://www.andyqian.com/2016/04/06/database/mysqleindex/ 在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以 ...

  3. Angularjs中添加HighCharts

    一. 添加基本配置 1. 添加指令 angular.module('newApp') .directive('dpHighchart', ['$rootScope', function($rootSc ...

  4. Android5.1 在init.rc 中添加自己的服务【转】

    本文转载自:http://blog.csdn.net/VOlsenBerg/article/details/71085610 我有一个需求就是在Android系统开机的时候把一个配置文件放到Andro ...

  5. 在html中添加script脚本的方法和注意事项

    在html中添加script脚本有两种方法,直接将javascript代码添加到html中与添加外部js文件,这两种方法都比较常用,大家可以根据自己需要自由选择 在html中添加<script& ...

  6. fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”? 解决方法

    错误描述: fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“#include "StdAfx.h"”? 错误分析:     此错误发 ...

  7. 在keil 4中添加stc系列芯片的方法--【sky原创】

    在keil 4中添加stc系列芯片的方法: 1.从官网下载uv3.cdb的文件网址是:http://www.stcmcu.com/ 2.下载好后把uv3.cdb文件改成STC.cdb:3. 然后将[S ...

  8. 在TC(Total Commander)中添加启动Cygwin快捷键的方法

    在TC(Total Commander)中添加启动Cygwin快捷键的方法 1.在Cygwin的安装目录下,增加文件tc-cygwin.bat(例如C:\cygwin-177\tc-cygwin.ba ...

  9. Visio中添加、移动或删除形状上的连接点的方法

    Visio中添加.移动或删除形状上的连接点的方法 利用Visio画图时,学会使用连接点能使你的画图质量和速度大幅度提高.下面在Visio2010中,以一个例子讲述如何使用连接点. 一. 准备 1. 打 ...

随机推荐

  1. MySQL的InnoDB引擎与MyISAM引擎

    MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与 ...

  2. 试着把.net的GC讲清楚(3)

    前两篇写的都是gc的一些概念和细节,这些东西对自己以后写代码有什么用,本篇我就准备将这些内容. root 第一篇文章中讲了GC在遍历存活对象的时候,都是从root开始的,root是一些对象的引用,例如 ...

  3. Oauth认证协议

    原文地址腾讯QQ第三方登录的实现原理? Oauth当中的角色: 1.Service Provider(服务提供方): 服务提供方通常是网站,在这些网站当中存储着一些受限制的资源,如照片.视频.联系人列 ...

  4. kibana常用聚合查询DSL语句记录

    -------- GET winlogbeat-2017.11.*/_search { "query": { "bool": { "must" ...

  5. ThinkPad W500 清灰记录

    转载请注明出处:HateMath归来(http://www.cnblogs.com/hatemath/) 看型号就知道,这是一台英雄迟暮型的老电脑.到了夏天,启动后啥事不做,通风口都烫手.心情好,一时 ...

  6. R+OCR︱借助tesseract包实现图片文本提取功能

    2016年11月,Jeroen Ooms在CRAN发布了tesseract包,实现了R语言对简单图片的文本提取.分析功能. 利用开源OCR引擎进行图片处理,目前可以识别超过100种语言,R语言可以借助 ...

  7. V4L2驱动的移植与应用(三)

    三.V4L2的demo capture.c是官方示例程序. capture.c 程序中的 process_image 函数: capture.c 程序主要是用来演示怎样使用 v4l2 接口,并没有对采 ...

  8. PHPmysqli的 预处理执行插入语句

    预编译在mysql端 预编译可以自动防止sql注入攻击 <?php //预编译技术 //1.创建一个mysqli对象 //2.创建myslqi预编译对象 $mysqli=); $mysqli-& ...

  9. php simpleXML操作xml的用法

    XML简介 XML是一种流行的半结构化文件格式,以一种类似数据库的格式存储数据.在实际应用中,一些简单的.安全性较低的数据往往使用 XML文件的格式进行存储.这样做的好处一方面可以通过减少与数据库的交 ...

  10. zTree实现地市县三级级联Service接口

    zTree实现地市县三级级联Service接口 ProvinceService.java: /** * @Title:ProvinceService.java * @Package:com.gwtjs ...