4个数随意运算得到结果是24

算24点游戏大家都玩过吧,那么怎么用程序来计算4个数的随意运算组合得到的结果是24呢?比如,5,5,5,1这四个数,如何凑才能得到结果为24?下面介绍一个很强悍的程序,可以将符合条件的所有组合列出来。澳门威尼斯人赌场

<?php
set_time_limit(0);
$values = array(5, 5, 5, 1);
$result = 24;
$list = array();
echo "<pre>";
makeValue($values);
print_r($list);
function makeValue($values, $set=array())
{
	$words = array("+", "-", "*", "/");
	if(sizeof($values)==1)
	{
		$set[] = array_shift($values);
		return makeSpecial($set);
	} 

	foreach($values as $key=>$value)
	{
		$tmpValues = $values;
		unset($tmpValues[$key]);
		foreach($words as $word)
		{
			makeValue($tmpValues, array_merge($set, array($value, $word)));
		}
	}
}
function makeSpecial($set)
{
	$size = sizeof($set);
	if($size<=3 || !in_array("/", $set) && !in_array("*", $set))
	{
		return makeResult($set);
	}
	for($len=3; $len<$size-1; $len+=2)
	{
		for($start=0; $start<$size-1; $start+=2)
		{
			if(!($set[$start-1]=="*" || $set[$start-1]=="/" || $set[$start+$len]=="*" || $set[$start+$len]=="/"))
				continue;
			$subSet = array_slice($set, $start, $len);
			if(!in_array("+", $subSet) && !in_array("-", $subSet))
				continue;
			$tmpSet = $set;
			array_splice($tmpSet, $start, $len-1);
			$tmpSet[$start] = "(".implode("", $subSet).")";
			makeSpecial($tmpSet);
		}
	}
}
function makeResult($set)
{
	global $result, $list;
	$str = implode("", $set);
	@eval("$num=$str;");
	if($num==$result && !in_array($str, $list))
	$list[] = $str;
}
?>

程序运行结果为:

Array
(
    [0] => (5-1/5)*5
    [1] => 5*(5-1/5)
)
时间: 2024-09-30 18:31:12

4个数随意运算得到结果是24的相关文章

24点——判断4个数能否经过运算使得结果为24

rqnoj74 Attention: 1.容易忽略(a[1]_a[2])_(a[3]_a[4]) 模式 2.通过两个整数相除,若保存结果为实型形式,不仅设置保存结果的变量为实型,而且还要1.0*x/y. Way1: 从所有的数中任意找到两个,并选择任意运算符并运算,使得两个数变成一个数,最后只剩下一个数,则该数为式子的值. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 5 //正常思路的

一个序列,除了一个数出现两次,其他数都出现一次,找出来重复的这个数-位运算应用(异或运算)

一个序列,除了一个数出现两次,其他数都出现一次,找出来重复的这个数-位运算应用 面试的题目 贴一下代码: 1 //位运算应用 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 const int maxn=1e5+10; 6 7 int n; 8 int a[maxn]; 9 10 void found(){ 11 int xors=0; 12 for(int i=0;i<n;i++){

四个数混合运算,数据库存题,程序集构建三层建构

1.Model类 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Model { public class TIModel { private string number1; private string number2; private string number3; private string number4; private string ope

剑指offer.二进制中1的个数(位运算)

题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. #include <iostream> #include <cstdio> #include <cstring> #include<vector> using namespace std; class Solution { public: int NumberOf1(int n) { int count=0; unsigned int mark=1; while(mark){ if

leetcode-位1的个数(位与运算)

位1的个数 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量). 示例 : 输入: 11 输出: 3 解释: 整数 11 的二进制表示为 00000000000000000000000000001011 示例 2: 输入: 128 输出: 1 解释: 整数 128 的二进制表示为 00000000000000000000000010000000 需要了解的知识: 位运算符 位运算符作用于位,并逐位执行操作.&. | 和 ^ 的真值表如下所示:

三个数混合运算和三层架构

1,数据访问层 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; using System.Windows.Forms; namespace SQL1 { class DB1//数据访问层! { public SqlConnection conn = new SqlConnecti

给出2个数和一个运算符号,用函数求结果

//给出2个数和一个运算符号 求结果$a = 15;//第一个数$b = 20;//第二个数字$c='/';//运算符$res = 0;//2个数字的结果if($c == '+'){    $res = $a+$b;}else if($c == '-'){    $res  = $a-$b;}else if($c == '*'){    $res = $a*$b;}else if($c == '/'){    $res = $a/$b;}echo $a.$c.$b.'='.$res;echo '

java 24点算法实现

最近闲来无事,突然怀念起小时候和堂兄表姐们经常玩24点游戏,于是就琢磨着是不是开发一个安卓手机版本.然后上网上一搜,发现已经被别人给开发烂了啊.不过这只能说明这个小游戏要想赚广告费很难了,但是拿来锻炼和在妹纸面前装逼还是很有价值的,嘿嘿,想到这里,我最终还是花了3天时间开发了一个小游戏出来. 算法实现 在网上试玩了一个flash的版本,发现还需要实现计算所有正确的结果,然后网上稍微百度了下思路,就开始自己实现了.我开始时大概的思路就是穷举出所有的数字和算式的排列组合,然后一一进行验算,中间碰到两

[华为oj]24点问题

这里提供自己解二十四点的思路.总的思路就是用类似递归思想: (1)在4个数中选两个数进行运算,与另外两个数放在一起,执行步骤(2): 判断步骤(2)返回结果,为1,返回结果1:为0,继续下一个运算,直至结束,返回结果0: (2)在3个数中选两个数进行运算,与另一个数放在一起,执行步骤(3): 判断步骤(3)返回结果,为1,返回结果1:为0,继续下一个运算,直至结束,返回结果0: (3)对两个数进行运算,判断是否为24.是,返回1:否,返回0. 这个思想就是穷举方法,列出所有可能的情况,有个好处就