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函数的话,就需要另外写一个方法手动计算公式的值了:
$str = '123456789';
$newStr = '';
function listarr($str, $newStr)
{
if(strlen($str) == 1){
$newStr = $newStr.'9';//手动加上最后一个9;
$res = cal($newStr);
if($res){
echo $newStr."<hr/>";
}
} else {
$newStr .= substr($str, 0, 1);
$str = substr($str, 1); //递归三种可能
listarr($str, $newStr.'+');
listarr($str, $newStr.'-');
listarr($str, $newStr);
}
function cal($str)
{
$arr = explode('+', $str);//分割数列,储存至数组中
$sum = 0;
foreach($arr as $v){
if(is_numeric($v)){ //判断分割的数组是否为纯数字;
$sum += $v;
} else {
$vArr = explode('-', $v); //对含减号的数组再进行一次分割;
$sum += $vArr[0]; //第一个值前的运算符为+;
unset($vArr[0]);
$s = array_sum($vArr);
$sum -= $s;
}
}
if($sum == 100){
return true;
} else {
return false;
}
}
listarr($str, $newStr);
最后补充一个通用模板
/**
* $data array 要计算的数列组合;
* $flag array 可用的运算符号
* $result int 要求的和的值
*/
function think_exp($data, $flag, $result)
{
$m = count($data);//m个数字
$n = count($flag);//n个符号
$num = str_split( sprintf ( "%0". ($m - 1) ."d",0) ); //生成一个[0,0,0,0,...,0]的数组
$exp = '';
while($num != 'Ok' ){
$line = '';
for ( $i=0; $i<$m; $i++ ) {
$line .= $data[$i]; //列出所有的式子;
if( isset($num[$i]) ) $line .= $flag[$num[$i]];
}
if ( eval('return '.$line.';') == $result) {
$exp .= $line.'='.$result.'<br />';
}
$num = getNext($num , 0, $n);
}
return $exp;
}
function getNext($next_num , $position = 0, $n){
if ($position == count($next_num)) return 'Ok';
$next_num[$position] = $next_num[$position] + 1;
if ($next_num[$position] < $n) {
return $next_num;
} else {
$next_num[$position] = 0;
return getNext($next_num, $position + 1, $n);
}
}
//计算题目
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的博客
PHP方法实现1-9数列中添加‘+’,‘-’或'',使和为100,并输出数列的更多相关文章
- ①创建项目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 ...
- mysql 中添加索引的三种方法
原文:http://www.andyqian.com/2016/04/06/database/mysqleindex/ 在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以 ...
- Angularjs中添加HighCharts
一. 添加基本配置 1. 添加指令 angular.module('newApp') .directive('dpHighchart', ['$rootScope', function($rootSc ...
- Android5.1 在init.rc 中添加自己的服务【转】
本文转载自:http://blog.csdn.net/VOlsenBerg/article/details/71085610 我有一个需求就是在Android系统开机的时候把一个配置文件放到Andro ...
- 在html中添加script脚本的方法和注意事项
在html中添加script脚本有两种方法,直接将javascript代码添加到html中与添加外部js文件,这两种方法都比较常用,大家可以根据自己需要自由选择 在html中添加<script& ...
- fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”? 解决方法
错误描述: fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“#include "StdAfx.h"”? 错误分析: 此错误发 ...
- 在keil 4中添加stc系列芯片的方法--【sky原创】
在keil 4中添加stc系列芯片的方法: 1.从官网下载uv3.cdb的文件网址是:http://www.stcmcu.com/ 2.下载好后把uv3.cdb文件改成STC.cdb:3. 然后将[S ...
- 在TC(Total Commander)中添加启动Cygwin快捷键的方法
在TC(Total Commander)中添加启动Cygwin快捷键的方法 1.在Cygwin的安装目录下,增加文件tc-cygwin.bat(例如C:\cygwin-177\tc-cygwin.ba ...
- Visio中添加、移动或删除形状上的连接点的方法
Visio中添加.移动或删除形状上的连接点的方法 利用Visio画图时,学会使用连接点能使你的画图质量和速度大幅度提高.下面在Visio2010中,以一个例子讲述如何使用连接点. 一. 准备 1. 打 ...
随机推荐
- hihoCoder1330 数组重排
题意 小Hi想知道,如果他每次都按照一种固定的顺序重排数组,那么最少经过几次重排之后数组会恢复初始的顺序? 具体来讲,给定一个1 - N 的排列 P,小Hi每次重排都是把第 i 个元素放到第 Pi个位 ...
- Dockerfile 编译安装mysql5.7 千万不要执行.只是记录一下编译安装罢了
开启所有核心make 20G 内存都不够玩,跑3-4个核心吧,还好. 最后的出来的镜像3G多,百思不得其解,看了官方的Dockerfile,也没什么特别,就是 apt 或者 yum.好吧,不知做了什 ...
- 基础--Redis在Linux环境下的安装
1. 安装redis服务 1.1 检查安装依赖程序 yum install gcc-c++yum install -y tclyum install wget 1.1.1 下载redis安装包 (或者 ...
- 用感知机(Perceptron)实现逻辑AND功能的Python3代码
之所以写这篇随笔,是因为参考文章(见文尾)中的的代码是Python2的,放到Python3上无法运行,我花了些时间debug,并记录了调试经过. 参考文章中的代码主要有两处不兼容Python3,一个是 ...
- java复习
局部变量的作用域只在方法内部有效,在方法外无效 用类型作为形参传递会改变实参的值,但是String是特殊的引用类型,作为形参传递不会影响实参的值. HashMap非线程安全,在多个线程访问Hashta ...
- java:条件表达式
if (results.length() == 0) { return ""; } else { return results.substring(0, results.lengt ...
- CSS盒模型的深度思考及BFC
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 题目:谈一谈你对CSS盒模型的认识 专业的面试,一定会问 CSS 盒模型 ...
- ELK 经典用法—企业自定义日志手机切割和mysql模块
本文收录在Linux运维企业架构实战系列 一.收集切割公司自定义的日志 很多公司的日志并不是和服务默认的日志格式一致,因此,就需要我们来进行切割了. 1.需切割的日志示例 2018-02-24 11: ...
- 流处理与消息队列------《Designing Data-Intensive Applications》读书笔记16
上一篇聊了聊批处理的缺点,对于无界数据来说,流处理会是更好的选择,"流"指的是随着时间的推移逐步增加的数据.消息队列可以将这些流组织起来,快速的在应用程序中给予反馈.但是消息队列与 ...
- Android学习开发中如何保持API的兼容
Android学习开发中如何保持API的兼容: 1,采用良好的设计思路 在设计过程中,如果能按照下面的方式来进行设计,会让这个API生命更长久 面向用例的设计,收集用户建议,把自己模拟成用户,保证AP ...