javascript - 在 Javascript 中使用随机数和运算符生成随机数学方程式

标签 javascript node.js string math prototype

我想创建一个程序,它应该使用 Random no 打印出最简单形式的数学表达式,例如 ( 21 + 13 ) * 56。 1到100,程序必须带一个level参数,level决定生成方程的长度,例如:

游戏必须生成包含加法 + 和乘法 * 运算符的方程式,例如 ( 21 + 13 ) * 56。(使用括号)

----level 2

75 - 54 = 21
62 + 15 = 77
88 / 22 = 4
93 + 22 = 115
90 * 11 = 990

--level 3

( 21 + 13 ) * 56 = 1904
82 - 19 + 16 = 79
51 * ( 68 - 2 ) = 3366

输入将是表单:例如

level 3

输出应该是:

( 21 + 13 ) * 56 // Simple expression using Random no.s

到目前为止,我可以创建不带括号的方程式,但我需要帮助给我可靠的解决方案

这是我到目前为止所做的:

var input = 'level 3'
input = input.split(' ')
var n = Number(input[1])
var x = ['/','*','-','+']
function randomNumberRange(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
var a = ''    
for(var i=0;i<n;i++){
    if(i !== n-1){
        var n1 = randomNumberRange(1, 100)
        var m = randomNumberRange(0, x.length);
        var str = x[m];
        a += n1
        a +=' '+str+' '
    }else{
        a += n1
    }  
}

最佳答案

我采用了@plamu 的想法来创建一个二叉树,其中每个 Node 代表一个具有左侧和右侧的运算符。

例如,方程 2 * (3 + 4) 可以看作是

  *
 / \
2   +
   / \
  3   4

您可以使用如下对象非常直接地表示这一点:

var TreeNode = function(left, right, operator) {
    this.left = left;
    this.right = right;
    this.operator = operator;

    this.toString = function() {
        return '(' + left + ' ' + operator + ' ' + right + ')';
    }
}

然后您可以创建一个递归函数来构建这样的树,其中一个子树将具有所需 Node 总数的一半(= 方程的长度):

function buildTree(numNodes) {
    if (numNodes === 1)
        return randomNumberRange(1, 100);

    var numLeft = Math.floor(numNodes / 2);
    var leftSubTree = buildTree(numLeft);
    var numRight = Math.ceil(numNodes / 2);
    var rightSubTree = buildTree(numRight);

    var m = randomNumberRange(0, x.length);
    var str = x[m];
    return new TreeNode(leftSubTree, rightSubTree, str);
}

这是一个 JSFiddle有一个工作示例。

也许您仍然想关心特殊情况,例如避免在顶层使用括号,但从这里开始应该不会太难。

关于javascript - 在 Javascript 中使用随机数和运算符生成随机数学方程式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32936045/

相关文章:

javascript - 如何使用 wavesurfer.js 实时显示剩余时间

javascript - "value"参数不能是数字

c++ - 将 char 指针中的字符替换为 memmove

c - fgets 读取比应有的更多的字符

javascript - 在 JavaScript 中解析 A​​mazon S3 输出

javascript - 可折叠的树布局。将 Twig 均匀展开

node.js - Stripe 付款方式。使用卡 [split-form] 不起作用。无法获取卡号到期和cvc号

javascript - NodeJS readdirSync() 未执行

c# - 如何使用 IndexOf 和 Substring 从字符串中解析文件名?

javascript - 当从方法体中执行对数组的推送时,数据是否不会保留在方法体范围之外?