24点游戏介绍:给出4个1-9之间的整数(ms我当年玩的时候是用扑克牌),其中每个数字必须且只用一次;任意使用+-*/ ( ),构造出一个表达式,使得最终结果为24,这就是常见的算24点的游戏(我的老家又叫“加减乘除24”,一语中的)。
记得还是在大学毕业前找工作的时候,面过一家电子商务领域非常有名的公司,其中笔试的一题就是计算24点。当时要求用c语言写出来,虽然笔者思路清晰(玩的很熟嘛^_^),可是c不过关,上机没有通过,想起来现在依然痛心。
现在想想,当年的实现太“中规中矩”了:先用递归构造表达式,接着switch case解析表达式并计算。可是在计算表达式的地方出现问题,印象中switch case了很多次,囧。
工作快两年了,也算积累了一些肤浅的经验。利用现有语言工具的函数或方法,我们计算起来相对而言轻松多了,而且功能更强大。下面就来实现一个通用的24点算法:不限数字大小必须是1-9(为了防止除数为0的情况,0可以特殊考虑,不作为输入参数),不限最终结果(大于小于等于24皆可)。
实现思路
a、构造表达式(所有输入的数字都用到,且只能用到一次。这个用递归人人皆可以)
b、利用c#的DataTable的Compute方法和javascript的eval函数,计算第一步构造出的表达式运算结果
下面将自己的实现贴出来(可是依然不会c实现^_^)。
1、c#代码:

Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Text.RegularExpressions;

namespace MyCsStudy
{
    /// <summary>
    /// 24点算法
    /// </summary>
    class TwentyFour
    {
        public static List<string> listOps = new List<string>(); //存加减乘除运算符
        static TwentyFour()
        {
            listOps.Add("+");
            listOps.Add("-");
            listOps.Add("*");
            listOps.Add("/");
        }
        public static bool Computing(string[] numArr, int numLen, int targetNum)
        {
            bool flag = false;
            for (int i = 0; i < numLen; i++)
            {
                for (int j = i + 1; j < numLen; j++)
                {
                    string[] strij = new string[] { numArr[i], numArr[j] };
                    numArr[j] = numArr[numLen - 1];
                    for (int k = 0; k < listOps.Count; k++)
                    {
                        numArr[i] = "(" + strij[0] + listOps[k] + strij[1] + ")";
                        if (Computing(numArr, numLen - 1, targetNum))
                        {
                            flag = true;
                            return flag;
                        }
                    }
                    numArr[i] = strij[0];
                    numArr[j] = strij[1];
                }
            }
            System.Data.DataTable dt = new System.Data.DataTable();
            string expression = numArr[0];
            /*
             * 利用datatable的compute方法计算字符串表达式(不知c有没有类似方法)
             * 如果不用datatable的compute方法,不知还有没有其他c#函数?
             * 期待高手给出更直观的解答
             */
            object objNum = dt.Compute(expression, "");
            int result;
            int.TryParse(objNum.ToString(), out result);

//如果运算结果是预期的数字,而且数组中的数字全部在运算范畴内
            if (result == targetNum && numLen == 1)
                flag = true;
            return flag;
        }

public static string GetExpression(string[] numArr, int targetNum)
        {
            string result = "没有匹配的表达式使之等于" + targetNum.ToString();
            if (Computing(numArr, numArr.Length, targetNum))
            {
                result = numArr[0].Substring(1, numArr[0].Length - 2) + "=" + targetNum.ToString();
            }
            return result;
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            string[] numArr = { "2", "4", "8", "16" }; //正常都是4个数字,本程序不限制个数
            string result = TwentyFour.GetExpression(numArr, 24); // 预期的目标计算结果可以不是24
            Console.WriteLine(result);
        }
    }
}

2、javascript代码:

Code
//twentyfour.js

var opArr =new Array("+", "-", "*","/"); //运算符数组

/*
参数说明:
1、numArr:输入的四个数字
2、numLen:输入的数字个数
3、targetNum:输入四个数字后要计算出的结果(24,etc)
*/
function computeNum(numArr, numLen, targetNum) {
    for (var i = 0; i < numLen; i++) {
        for (var j = i + 1; j < numLen; j++) {
            var numij = [numArr[i], numArr[j]];
            numArr[j] = numArr[numLen - 1];
            for (var k = 0; k < opArr.length; k++) {
                numArr[i] = '(' + numij[k % 2] + opArr[k] + numij[(!(k % 2) * 1)] + ')'; //构建算术表达式,然后利用eval函数计算结果
                if (computeNum(numArr, numLen - 1, targetNum)) {
                    return true;
                }
            }
            numArr[i] = numij[0];
            numArr[j] = numij[1];
        }
    }
    var tmpStr=numArr[0];
    return (numLen == 1) && (eval( numArr[0]) == targetNum); //通过js的eval函数直接算出预期结果targetNum
}

//获取最终的计算表达式
function getExpression(numArr,targetNum) {
    if (computeNum(numArr, numArr.length, targetNum)) {
        var str = numArr[0].substring(1, numArr[0].length - 1);
        return numArr[0].substring(1, numArr[0].length - 1)+"="+String(targetNum);
    } else {
        return "没有匹配的表达式使之等于" + targetNum;
    }
}

//单击按钮,显示结果
function showExpression() {
var txtNumberArr=document.getElementsByName("txtNumber");
var txtTargetNum=document.getElementById("txtTargetNumber").value;
var txtResult=document.getElementById("txtExpression");
var numsArr=new Array();
for(var i=0;i<txtNumberArr.length;i++){
numsArr.push(txtNumberArr[i].value);
}
txtResult.value=getExpression(numsArr,txtTargetNum);
}

测试的网页一并贴出来:

Code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>runcode</title>
 <script src="js/twentyfour.js" type="text/javascript"></script>
</head>
<body >
    <form id="form1">
    <div>
        数字1: <input type="text" name="txtNumber" value="2" />&nbsp;数字2: <input type="text" name="txtNumber" value="4"/><br/>
        数字3: <input type="text" name="txtNumber" value="8"/>&nbsp;数字4: <input type="text" name="txtNumber" value="16"/><br/>    
        期望计算结果: <input type="text" value="24" id="txtTargetNumber"/><br/><br/>
        <input type="button" value="算术表达式" onclick="showExpression()" /><br/><br/>
        <input type="text" id="txtExpression" style="width:350px;" />
    </div>
</form>
</body>
</html>

ps:本人对js函数不熟悉,不知道还有没有更直接的函数。
我个人认为上述两种实现都挺直观的。步骤二里实现计算的算法其实都转移给了语言工具(c#和js),不知道c可不可以。
好了,欢迎其他语言的高手贴出更优秀简洁的代码(尤其是c),共同交流学习,先洗洗睡了。

c#和javascript分别轻松实现计算24点相关推荐

  1. 【JavaScript】计算24点

    华为算法题1: /**  * 计算24点是一种扑克牌益智游戏,随机抽出4张扑克牌,通过加(+),减(-),乘(*), 除(/)四种运算法则计算得到整数24,本问题中,扑克牌通过如下字符或者字符串表示, ...

  2. JavaScript 初学者应知的 24 条最佳实践

    原文:24 JavaScript Best Practices for Beginners (注:阅读原文的时候没有注意发布日期,觉得不错就翻译了,翻译到 JSON.parse 那一节觉得有点不对路才 ...

  3. 利用Html,Css,javaScript简单写一个计算一天秒的倒计时

    利用Html,Css,javaScript简单写一个计算一天还剩多少秒的倒计时页面 代码我放下面,不多,就是我那个背景图我没有用精灵图,主要拼接太麻烦了,我直接img了,然后display:none; ...

  4. JavaScript实现动态规划方法计算特定位置的斐波那契数fibonacciNth算法(附完整源码)

    JavaScript实现动态规划方法计算特定位置的斐波那契数fibonacciNth算法(附完整源码) fibonacciNth.js完整源代码 fibonacciNth.js完整源代码 export ...

  5. JavaScript eval() 函数,计算某个字符串,并执行其中的的 JavaScript 代码。

    JavaScript eval() 函数,计算某个字符串,并执行其中的的 JavaScript 代码. 适合用于计算器的计算,等. 例子: eval("x=10;y=20;document. ...

  6. 24点游戏java_使用java编写计算24点游戏程序

    初学java,编写了一个计算24点的程序,时间有限,有些粗糙,不过可以使用. //-------------Cal24.java--------------- //计算24点程序 //作者:徒步天下( ...

  7. 计算机公式求时间差公式,24时间差计算公式 excel中计算24小时

    excel中计算24小时制时间差 怎样在excel中计算24小时制时间差,在一天之内的小编会,不过不在一天之内外套一个MOD函数,就行了,这样试试 =MOD("0:36"-&quo ...

  8. 1224 红魔馆的纸牌游戏 (计算24点,dfs)

    Description 红魔馆的蕾米莉亚大小姐一天发现人类有一种叫做24点的游戏,于是就带着一副不知哪里弄来的扑克牌到图书馆找帕秋莉玩 24点游戏的规则:从一副牌中随机抽取4张牌,牌的点数为1到13之 ...

  9. 阿里云云计算 24 SLB的概念

    阿里云云计算 24 SLB的概念 参考 https://edu.aliyun.com/lesson_547_21891#_21891

最新文章

  1. Linux磁盘阵列技术详解(二)--raid 1创建
  2. numpy使用[]语法索引二维numpy数组中指定指定行之后所有数据行的数值内容(accessing rows in numpy array after specifc row)
  3. 昨日,GitHub宣布收购npm,微软或成最大赢家!
  4. 作为医生,除了买花,还能在情人节用什么特别的方式表白呢?(情书-病历体)...
  5. matlab编程ode45,matlab 中ode45的源代码如何看懂
  6. macpro连接不到索尼耳机WH-1000XM3搜索不到索尼连接
  7. href 带参数 打开exe_js调用winform程序(带参数)
  8. wine mac 中文 方块乱码 解决
  9. Typecho评论邮件提醒插件美化版CommentToMail
  10. Mac下卸载Idea
  11. 深入理解java虚拟机_深入理解Java类加载
  12. for循环批量写文件 shell_Shell脚本编程03下——Shell编程之循环语句
  13. 【16年浙江省赛H ZOJ 3965】Binary Tree Restoring 【两个dfs序还原】
  14. onTouch事件分发
  15. 谈谈CompoundButton的OnCheckedChangeListener
  16. 可视对讲网络协议转换器怎么使用,协议转换器使用方法详细介绍
  17. 【JavaSE8 高级编程 多线程】多线程入门级解析 2019_7_27
  18. 【日语】动词的九种变形
  19. 【百科】中华医书集成
  20. 新增免费根据商品条码查询商品名称API

热门文章

  1. 使用GDB调试器(一)
  2. 【不积跬步,无以致千里】linux下如何查看自己的外网IP
  3. Word 2003特殊符号录入与编辑(转)
  4. vsftpd虚拟用户使用实验报告
  5. Error: Could not link: /usr/local/share/doc/homebrew
  6. 7-2 搜索树判断 (25 分)
  7. 大数据对医学发展有什么影响
  8. 大数据在消防安全中的新应用
  9. Scala学习(二、控制结构)
  10. 机器学习初级入门(一)感知机