[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"content-javascript-version-of-24-points-game":3,"$f2kv66agdkb3fv":21},{"id":4,"type":5,"slug":6,"title":7,"date":8,"category":9,"tags":10,"body_markdown":14,"permalink":15,"excerpt_src":15,"media_type":15,"media_title":15,"media_author":15,"media_url":15,"rating":15,"layout":15,"pv":16,"admin_only":16,"created_at":17,"updated_at":17,"deleted_at":15,"status":18,"html":19,"cover":20},153,"article","javascript-version-of-24-points-game","JavaScript版24点","2010-05-12 02:02:30","web",[11,12,13],"游戏","JavaScript","24点","\n前几天去森林公园烧烤，和同学一起玩24点。以前玩过，再次玩起来还是觉得不甘心，尤其是当我们都认为无解的情况。\n\n回来后就想写24点的计算程序，想了一下，似乎除了穷举之外没有其他的方法，上网搜了一下，也都是用的穷兴举法。不过算法不算很高效，其中[http:\u002F\u002Fwww.blogjava.net\u002Fcomic222\u002Farchive\u002F2009-01-06\u002F250101.html](http:\u002F\u002Fwww.blogjava.net\u002Fcomic222\u002Farchive\u002F2009-01-06\u002F250101.html)所述算法取2个数字有6种取法，运算有6种（减法和除法是有顺序的），第二次取数有3种取法，运算有6种，第三次取数有1种取法，运算有6种，所以一共有6\\*6\\*3\\*6\\*1\\*6=3888个表达式，而[http:\u002F\u002Fhi.baidu.com\u002Fgreation\u002Fblog\u002Fitem\u002F1f68fbfa808d10d9b58f3106.html](http:\u002F\u002Fhi.baidu.com\u002Fgreation\u002Fblog\u002Fitem\u002F1f68fbfa808d10d9b58f3106.html)就更夸张了，直接用循环（多少重，我没数……）要判断次数：4\\*3\\*2\\*1\\*4\\*4\\*4\\*11=16896。（不过这个思路挺好的，设定了11个表达式形式，不过经我验证，第一个表达式可以完全归入下面十个。）\n\n分析发现，在穷举过程中存在大量重复表达式，比如1，2，3，4这四个数字，1+2+3+4要运算一次，2+1+3+4又要运算一次，这样1+2+3+4等价的表达式就多达24个！\n\n为了尽量减少重复表达式，我决定将表达式按运算符类型分类，方案如下：\n\n1. 将所有只含有加减法提出来，将第一个数字前面也加上运算符，共有4个运算符，所以共有2^4=16种运算符方案，因为加减法是可以交换可以结合的，所以等价的表达式就不用再验证。又因为24点中不能4个数字前全是减号（负号），即至少有一个正数作为被减数，所以共有16-15个表达式；同理可知，只含有乘除法的表达式有15个（除号放在数前面用“1\u002F”表式，即该数的倒数）。\n2. 若是两端乘除再中间一加减（如2\\*9+1\\*6），用于乘除的两两组合有C(4,2)\u002F2=3种，每个乘除运算有3种（两数相乘，前者除后者，后者除前者），加减有3种（两数相加，前者减后者，后者减前者），共有3\\*3^2\\*3=81个表达式；同理，若是两端加减再中间一乘除，共有81个表达式。\n3. 若是前面两个乘除运算，后面一个加减运算，用于乘除运算的数字组合有4种选择，乘除方案有2^3-1=7种（因为不能全是除，所以减一），加减有3种，共有4\\*7\\*3=84个表达式，同理，若是先两个加减运算，再一个乘除运算，有84个表达式。\n4. 若是先乘除一次，再加减一次，再加减或者乘除一次，则第一步乘除运算取数字有6种取法，乘除方案有3种，第二步取数字有2种取法，加减方案有3种，第三步取数字有1种取法，加减乘除方案有7种（2\\*4-1），共有6\\*3\\*2\\*3\\*1\\*7=756个表达式；同理，先加减再乘除再加减，共有756个表达式。\n\n共计需要判断的表达式有15+15+81+81+84+84+756+756=1872个。\n\n已经用JavaScript实现，未加入对输入是否合法的判断。因为乘法中“负负得正”，所以有时候会出现几乎重复的方案，是否能够进一步优化待尚探讨。凌晨2点写完。以下是具体的程序代码：\n\n\t\u003C!DOCTYPE html PUBLIC \"-\u002F\u002FW3C\u002F\u002FDTD XHTML 1.0 Transitional\u002F\u002FEN\" \"http:\u002F\u002Fwww.w3.org\u002FTR\u002Fxhtml1\u002FDTD\u002Fxhtml1-transitional.dtd\">\n\t\u003Chtml xmlns=\"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml\">\n\t\t\u003Chead>\n\t \t\u003Ctitle>JavaScript 24点\u003C\u002Ftitle>\n\t\t\u003C\u002Fhead>\n\t\u003Cbody>\n\t\t数1：\u003Cinput type=\"text\" \u002F>\u003Cbr \u002F>\n\t\t数2：\u003Cinput type=\"text\" \u002F>\u003Cbr \u002F>\n\t\t数3：\u003Cinput type=\"text\" \u002F>\u003Cbr \u002F>\n\t\t数4：\u003Cinput type=\"text\" \u002F>\u003Cbr \u002F>\n\t\t\u003Cinput type=\"submit\" value=\"计算\" onclick=\"startcalc();\" \u002F>\n\t\t\u003Cdiv id=\"result\">\u003C\u002Fdiv>\n\t\u003C\u002Fbody>\n\t\u003Cscript language=\"javascript\">\n\tvar n=new Array(0,0,0,0)\n\tvar o=new Array(\"\",\"\",\"\",\"\",\"\",\"\")\n\tvar count=0;\n\tfunction check(expression)\n\t{\n\t\tcount++;\n\t\tif (Math.abs(eval(expression)-24)\u003C0.0001)\n\t\t{\n\t\t\tdocument.getElementById(\"result\").innerHTML=document.getElementById(\"result\").innerHTML+\"第\"+count+\"次判断，找到有效解：\"+expression+\"\u003Cbr \u002F>\";\n\t\t}\n\t}\n\tfunction startcalc()\n\t{\n\t\tcount=0;\n\t\tfor (var i=0;i\u003C4;i++)\n\t\t{\n\t\t\tn[i]=document.getElementsByTagName(\"input\")[i].value;\n\t\t}\n\t\t\u002F\u002F全加减和全乘除，类似a+b-c+d\n\t\tfor (var i=0;i\u003C2;i++)\n\t\t\tfor (var j=0;j\u003C2;j++)\n\t\t\t\tfor (var k=0;k\u003C2;k++)\n\t\t\t\t\tfor (var l=0;l\u003C2;l++)\n\t\t\t\t\t{\n\t\t\t\t\t\t\u002F\u002F加减\n\t\t\t\t\t\to[0]=[\"\",\"-\"][i];\n\t\t\t\t\t\to[1]=[\"+\",\"-\"][j];\n\t\t\t\t\t\to[2]=[\"+\",\"-\"][k];\n\t\t\t\t\t\to[3]=[\"+\",\"-\"][l];\n\t\t\t\t\t\tif(!(o[0]==\"-\"&&o[1]==\"-\"&&o[2]==\"-\"&&o[3]==\"-\"))\n\t\t\t\t\t\t\tcheck(o[0]+n[0]+o[1]+n[1]+o[2]+n[2]+o[3]+n[3]);\n\t\t\t\t\t\t\u002F\u002F乘除\n\t\t\t\t\t\to[0]=[\"\",\"1\u002F\"][i];\n\t\t\t\t\t\to[1]=[\"*\",\"\u002F\"][j];\n\t\t\t\t\t\to[2]=[\"*\",\"\u002F\"][k];\n\t\t\t\t\t\to[3]=[\"*\",\"\u002F\"][l];\n\t\t\t\t\t\tif(!(o[0]==\"1\u002F\"&&o[1]==\"\u002F\"&&o[2]==\"\u002F\"&&o[3]==\"\u002F\"))\n\t\t\t\t\t\t\tcheck(o[0]+n[0]+o[1]+n[1]+o[2]+n[2]+o[3]+n[3]);\n\t\t\t\t\t}\n\t\t\u002F\u002F两端乘除中间加减或者两端加减中间乘除，如（6-2）*（8-2）\n\t\tfor(var i=1;i\u003C4;i++)\n\t\t{\n\t\t\tvar temparr=new Array(0,0,0,0);\n\t\t\ttemparr=n;\n\t\t\tvar tempnum=temparr[i];\n\t\t\ttemparr[i]=temparr[1];\n\t\t\ttemparr[1]=tempnum;\n\t\t\tfor(var j1=0;j1\u003C2;j1++)\n\t\t\t\tfor(var j2=0;j2\u003C2;j2++)\n\t\t\t\t\tfor(var j3=0;j3\u003C2;j3++)\n\t\t\t\t\t\tfor(var j4=0;j4\u003C2;j4++)\n\t\t\t\t\t\t\tfor(var j5=0;j5\u003C2;j5++)\n\t\t\t\t\t\t\t\tfor(var j6=0;j6\u003C2;j6++)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\u002F\u002F先加减后乘除\n\t\t\t\t\t\t\t\t\to[0]=[\"\",\"1\u002F\"][j1];\n\t\t\t\t\t\t\t\t\to[1]=[\"\",\"-\"][j2];\n\t\t\t\t\t\t\t\t\to[2]=[\"+\",\"-\"][j3];\n\t\t\t\t\t\t\t\t\to[3]=[\"*\",\"\u002F\"][j4];\n\t\t\t\t\t\t\t\t\to[4]=[\"\",\"-\"][j5];\n\t\t\t\t\t\t\t\t\to[5]=[\"+\",\"-\"][j6];\n\t\t\t\t\t\t\t\t\tif(!(o[0]==\"1\u002F\"&&o[3]==\"\u002F\") && !(o[1]==\"-\"&&o[2]==\"-\") && !(o[4]==\"-\"&&o[5]==\"-\"))\n\t\t\t\t\t\t\t\t\t\tcheck(o[0]+\"(\"+o[1]+temparr[0]+o[2]+temparr[1]+\")\"+o[3]+\"(\"+o[4]+temparr[2]+o[5]+temparr[3]+\")\");\n\t\t\t\t\t\t\t\t\t\u002F\u002F先乘除后加减\n\t\t\t\t\t\t\t\t\to[0]=[\"\",\"-\"][j1];\n\t\t\t\t\t\t\t\t\to[1]=[\"\",\"1\u002F\"][j2];\n\t\t\t\t\t\t\t\t\to[2]=[\"*\",\"\u002F\"][j3];\n\t\t\t\t\t\t\t\t\to[3]=[\"+\",\"-\"][j4];\n\t\t\t\t\t\t\t\t\to[4]=[\"\",\"1\u002F\"][j5];\n\t\t\t\t\t\t\t\t\to[5]=[\"*\",\"\u002F\"][j6];\n\t\t\t\t\t\t\t\t\tif(!(o[0]==\"-\"&&o[3]==\"-\") && !(o[1]==\"1\u002F\"&&o[2]==\"\u002F\") && !(o[4]==\"1\u002F\"&&o[5]==\"\u002F\"))\n\t\t\t\t\t\t\t\t\t\tcheck(o[0]+o[1]+temparr[0]+o[2]+temparr[1]+o[3]+o[4]+temparr[2]+o[5]+temparr[3]);\n\t\t\t\t\t\t\t\t}\n\t\t}\n\t\t\u002F\u002F两次乘除一次加减或者两次加减一次乘除，如3*4*3-12\n\t\tfor(var i=0;i\u003C4;i++)\n\t\t{\n\t\t\tvar temparr=new Array(0,0,0,0);\n\t\t\ttemparr=n;\n\t\t\tvar tempnum=temparr[i];\n\t\t\ttemparr[i]=temparr[3];\n\t\t\ttemparr[3]=tempnum;\n\t\t\tfor(var j1=0;j1\u003C2;j1++)\n\t\t\t\tfor(var j2=0;j2\u003C2;j2++)\n\t\t\t\t\tfor(var j3=0;j3\u003C2;j3++)\n\t\t\t\t\t\tfor(var j4=0;j4\u003C2;j4++)\n\t\t\t\t\t\t\tfor(var j5=0;j5\u003C2;j5++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\u002F\u002F先加减后乘除\n\t\t\t\t\t\t\t\to[0]=[\"\",\"1\u002F\"][j1];\n\t\t\t\t\t\t\t\to[1]=[\"\",\"-\"][j2];\n\t\t\t\t\t\t\t\to[2]=[\"+\",\"-\"][j3];\n\t\t\t\t\t\t\t\to[3]=[\"+\",\"-\"][j4];\n\t\t\t\t\t\t\t\to[4]=[\"*\",\"\u002F\"][j5];\n\t\t\t\t\t\t\t\tif(!(o[1]==\"-\"&&o[2]==\"-\"&&o[3]==\"-\") && !(o[0]==\"1\u002F\"&&o[4]==\"\u002F\"))\n\t\t\t\t\t\t\t\t\tcheck(o[0]+\"(\"+o[1]+temparr[0]+o[2]+temparr[1]+o[3]+temparr[2]+\")\"+o[4]+temparr[3]);\n\t\t\t\t\t\t\t\t\u002F\u002F先乘除后加减\n\t\t\t\t\t\t\t\to[0]=[\"\",\"-\"][j1];\n\t\t\t\t\t\t\t\to[1]=[\"\",\"1\u002F\"][j2];\n\t\t\t\t\t\t\t\to[2]=[\"*\",\"\u002F\"][j3];\n\t\t\t\t\t\t\t\to[3]=[\"*\",\"\u002F\"][j4];\n\t\t\t\t\t\t\t\to[4]=[\"+\",\"-\"][j5];\n\t\t\t\t\t\t\t\tif(!(o[1]==\"1\u002F\"&&o[2]==\"\u002F\"&&o[3]==\"\u002F\") && !(o[0]==\"-\"&&o[4]==\"-\"))\n\t\t\t\t\t\t\t\t\tcheck(o[0]+o[1]+temparr[0]+o[2]+temparr[1]+o[3]+temparr[2]+o[4]+temparr[3]);\n\t\t\t\t\t\t\t}\n\t\t}\n\t\t\u002F\u002Falert(count);\n\t\t\u002F\u002F至此共判断360次，与预期一样\n\t\t\u002F\u002F乘除一次，加减一次，加减乘除一次，或者反过来，如(（3+4）*3)+3\n\t\tfor(var i=0;i\u003C4;i++)\n\t\t\tfor(var j=i+1;j\u003C4;j++)\n\t\t\t{\n\t\t\t\tvar temparr=new Array(0,0,0,0);\n\t\t\t\ttemparr=n;\n\t\t\t\tvar tempnum=temparr[i];\n\t\t\t\ttemparr[i]=temparr[0];\n\t\t\t\ttemparr[0]=tempnum;\n\t\t\t\ttempnum=temparr[j];\n\t\t\t\ttemparr[j]=temparr[1];\n\t\t\t\ttemparr[1]=tempnum;\n\t\t\t\tfor (var k=2;k\u003C4;k++)\n\t\t\t\t{\n\t\t\t\t\ttempnum=temparr[k];\n\t\t\t\t\ttemparr[k]=temparr[2]\n\t\t\t\t\ttemparr[2]=tempnum;\n\t\t\t\t\tfor(var j1=0;j1\u003C2;j1++)\n\t\t\t\t\t\tfor(var j2=0;j2\u003C2;j2++)\n\t\t\t\t\t\t\tfor(var j3=0;j3\u003C2;j3++)\n\t\t\t\t\t\t\t\tfor(var j4=0;j4\u003C2;j4++)\n\t\t\t\t\t\t\t\t\tfor(var j5=0;j5\u003C2;j5++)\n\t\t\t\t\t\t\t\t\t\tfor(var j6=0;j6\u003C4;j6++)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\u002F\u002F先加减后乘除再加减\n\t\t\t\t\t\t\t\t\t\t\to[0]=[\"\",\"-\"][j1];\n\t\t\t\t\t\t\t\t\t\t\to[1]=[\"\",\"1\u002F\"][j2];\n\t\t\t\t\t\t\t\t\t\t\to[2]=[\"\",\"-\"][j3];\n\t\t\t\t\t\t\t\t\t\t\to[3]=[\"+\",\"-\"][j4];\n\t\t\t\t\t\t\t\t\t\t\to[4]=[\"*\",\"\u002F\"][j5];\n\t\t\t\t\t\t\t\t\t\t\to[5]=[\"+\",\"-\",\"*\",\"\u002F\"][j6];\n\t\t\t\t\t\t\t\t\t\t\tif(!(o[2]==\"-\"&&o[3]==\"-\")&&!(o[1]==\"1\u002F\"&&o[4]==\"\u002F\")&&!(o[0]==\"-\"&&o[5]==\"-\"))\n\t\t\t\t\t\t\t\t\t\t\t\tcheck(o[0]+\"(\"+o[1]+\"(\"+o[2]+temparr[0]+o[3]+temparr[1]+\")\"+o[4]+temparr[2]+\")\"+o[5]+temparr[3]);\n\t\t\t\t\t\t\t\t\t\t\t\u002F\u002F先乘除后加减再乘除\n\t\t\t\t\t\t\t\t\t\t\to[0]=[\"\",\"1\u002F\"][j1];\n\t\t\t\t\t\t\t\t\t\t\to[1]=[\"\",\"-\"][j2];\n\t\t\t\t\t\t\t\t\t\t\to[2]=[\"\",\"1\u002F\"][j3];\n\t\t\t\t\t\t\t\t\t\t\to[3]=[\"*\",\"\u002F\"][j4];\n\t\t\t\t\t\t\t\t\t\t\to[4]=[\"+\",\"-\"][j5];\n\t\t\t\t\t\t\t\t\t\t\to[5]=[\"+\",\"-\",\"*\",\"\u002F\"][j6];\n\t\t\t\t\t\t\t\t\t\t\tif(!(o[2]==\"1\u002F\"&&o[3]==\"\u002F\")&&!(o[1]==\"-\"&&o[4]==\"-\")&&!(o[0]==\"1\u002F\"&&o[5]==\"\u002F\"))\n\t\t\t\t\t\t\t\t\t\t\t\tcheck(o[0]+\"(\"+o[1]+\"(\"+o[2]+temparr[0]+o[3]+temparr[1]+\")\"+o[4]+temparr[2]+\")\"+o[5]+temparr[3]);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n\t\tdocument.getElementById(\"result\").innerHTML=document.getElementById(\"result\").innerHTML+\"共计判断表达式\"+count+\"次\";\n\t}\n\t\u003C\u002Fscript>\n\t\u003C\u002Fhtml>\n\n> 演示地址已经放到[https:\u002F\u002Frawcdn.githack.com\u002FTooBug\u002Fworks\u002Fgh-pages\u002F24points\u002Findex.html](https:\u002F\u002Frawcdn.githack.com\u002FTooBug\u002Fworks\u002Fgh-pages\u002F24points\u002Findex.html)。\n",null,0,"2026-08-28 04:37:17","published","\u003Cp>前几天去森林公园烧烤，和同学一起玩24点。以前玩过，再次玩起来还是觉得不甘心，尤其是当我们都认为无解的情况。\u003C\u002Fp>\n\u003Cp>回来后就想写24点的计算程序，想了一下，似乎除了穷举之外没有其他的方法，上网搜了一下，也都是用的穷兴举法。不过算法不算很高效，其中\u003Ca href=\"http:\u002F\u002Fwww.blogjava.net\u002Fcomic222\u002Farchive\u002F2009-01-06\u002F250101.html\">http:\u002F\u002Fwww.blogjava.net\u002Fcomic222\u002Farchive\u002F2009-01-06\u002F250101.html\u003C\u002Fa>所述算法取2个数字有6种取法，运算有6种（减法和除法是有顺序的），第二次取数有3种取法，运算有6种，第三次取数有1种取法，运算有6种，所以一共有6*6*3*6*1*6=3888个表达式，而\u003Ca href=\"http:\u002F\u002Fhi.baidu.com\u002Fgreation\u002Fblog\u002Fitem\u002F1f68fbfa808d10d9b58f3106.html\">http:\u002F\u002Fhi.baidu.com\u002Fgreation\u002Fblog\u002Fitem\u002F1f68fbfa808d10d9b58f3106.html\u003C\u002Fa>就更夸张了，直接用循环（多少重，我没数……）要判断次数：4*3*2*1*4*4*4*11=16896。（不过这个思路挺好的，设定了11个表达式形式，不过经我验证，第一个表达式可以完全归入下面十个。）\u003C\u002Fp>\n\u003Cp>分析发现，在穷举过程中存在大量重复表达式，比如1，2，3，4这四个数字，1+2+3+4要运算一次，2+1+3+4又要运算一次，这样1+2+3+4等价的表达式就多达24个！\u003C\u002Fp>\n\u003Cp>为了尽量减少重复表达式，我决定将表达式按运算符类型分类，方案如下：\u003C\u002Fp>\n\u003Col>\n\u003Cli>将所有只含有加减法提出来，将第一个数字前面也加上运算符，共有4个运算符，所以共有2^4=16种运算符方案，因为加减法是可以交换可以结合的，所以等价的表达式就不用再验证。又因为24点中不能4个数字前全是减号（负号），即至少有一个正数作为被减数，所以共有16-15个表达式；同理可知，只含有乘除法的表达式有15个（除号放在数前面用“1\u002F”表式，即该数的倒数）。\u003C\u002Fli>\n\u003Cli>若是两端乘除再中间一加减（如2*9+1*6），用于乘除的两两组合有C(4,2)\u002F2=3种，每个乘除运算有3种（两数相乘，前者除后者，后者除前者），加减有3种（两数相加，前者减后者，后者减前者），共有3*3^2*3=81个表达式；同理，若是两端加减再中间一乘除，共有81个表达式。\u003C\u002Fli>\n\u003Cli>若是前面两个乘除运算，后面一个加减运算，用于乘除运算的数字组合有4种选择，乘除方案有2^3-1=7种（因为不能全是除，所以减一），加减有3种，共有4*7*3=84个表达式，同理，若是先两个加减运算，再一个乘除运算，有84个表达式。\u003C\u002Fli>\n\u003Cli>若是先乘除一次，再加减一次，再加减或者乘除一次，则第一步乘除运算取数字有6种取法，乘除方案有3种，第二步取数字有2种取法，加减方案有3种，第三步取数字有1种取法，加减乘除方案有7种（2*4-1），共有6*3*2*3*1*7=756个表达式；同理，先加减再乘除再加减，共有756个表达式。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>共计需要判断的表达式有15+15+81+81+84+84+756+756=1872个。\u003C\u002Fp>\n\u003Cp>已经用JavaScript实现，未加入对输入是否合法的判断。因为乘法中“负负得正”，所以有时候会出现几乎重复的方案，是否能够进一步优化待尚探讨。凌晨2点写完。以下是具体的程序代码：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>&lt;!DOCTYPE html PUBLIC &quot;-\u002F\u002FW3C\u002F\u002FDTD XHTML 1.0 Transitional\u002F\u002FEN&quot; &quot;http:\u002F\u002Fwww.w3.org\u002FTR\u002Fxhtml1\u002FDTD\u002Fxhtml1-transitional.dtd&quot;&gt;\n&lt;html xmlns=&quot;http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml&quot;&gt;\n\t&lt;head&gt;\n \t&lt;title&gt;JavaScript 24点&lt;\u002Ftitle&gt;\n\t&lt;\u002Fhead&gt;\n&lt;body&gt;\n\t数1：&lt;input type=&quot;text&quot; \u002F&gt;&lt;br \u002F&gt;\n\t数2：&lt;input type=&quot;text&quot; \u002F&gt;&lt;br \u002F&gt;\n\t数3：&lt;input type=&quot;text&quot; \u002F&gt;&lt;br \u002F&gt;\n\t数4：&lt;input type=&quot;text&quot; \u002F&gt;&lt;br \u002F&gt;\n\t&lt;input type=&quot;submit&quot; value=&quot;计算&quot; onclick=&quot;startcalc();&quot; \u002F&gt;\n\t&lt;div id=&quot;result&quot;&gt;&lt;\u002Fdiv&gt;\n&lt;\u002Fbody&gt;\n&lt;script language=&quot;javascript&quot;&gt;\nvar n=new Array(0,0,0,0)\nvar o=new Array(&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;)\nvar count=0;\nfunction check(expression)\n{\n\tcount++;\n\tif (Math.abs(eval(expression)-24)&lt;0.0001)\n\t{\n\t\tdocument.getElementById(&quot;result&quot;).innerHTML=document.getElementById(&quot;result&quot;).innerHTML+&quot;第&quot;+count+&quot;次判断，找到有效解：&quot;+expression+&quot;&lt;br \u002F&gt;&quot;;\n\t}\n}\nfunction startcalc()\n{\n\tcount=0;\n\tfor (var i=0;i&lt;4;i++)\n\t{\n\t\tn[i]=document.getElementsByTagName(&quot;input&quot;)[i].value;\n\t}\n\t\u002F\u002F全加减和全乘除，类似a+b-c+d\n\tfor (var i=0;i&lt;2;i++)\n\t\tfor (var j=0;j&lt;2;j++)\n\t\t\tfor (var k=0;k&lt;2;k++)\n\t\t\t\tfor (var l=0;l&lt;2;l++)\n\t\t\t\t{\n\t\t\t\t\t\u002F\u002F加减\n\t\t\t\t\to[0]=[&quot;&quot;,&quot;-&quot;][i];\n\t\t\t\t\to[1]=[&quot;+&quot;,&quot;-&quot;][j];\n\t\t\t\t\to[2]=[&quot;+&quot;,&quot;-&quot;][k];\n\t\t\t\t\to[3]=[&quot;+&quot;,&quot;-&quot;][l];\n\t\t\t\t\tif(!(o[0]==&quot;-&quot;&amp;&amp;o[1]==&quot;-&quot;&amp;&amp;o[2]==&quot;-&quot;&amp;&amp;o[3]==&quot;-&quot;))\n\t\t\t\t\t\tcheck(o[0]+n[0]+o[1]+n[1]+o[2]+n[2]+o[3]+n[3]);\n\t\t\t\t\t\u002F\u002F乘除\n\t\t\t\t\to[0]=[&quot;&quot;,&quot;1\u002F&quot;][i];\n\t\t\t\t\to[1]=[&quot;*&quot;,&quot;\u002F&quot;][j];\n\t\t\t\t\to[2]=[&quot;*&quot;,&quot;\u002F&quot;][k];\n\t\t\t\t\to[3]=[&quot;*&quot;,&quot;\u002F&quot;][l];\n\t\t\t\t\tif(!(o[0]==&quot;1\u002F&quot;&amp;&amp;o[1]==&quot;\u002F&quot;&amp;&amp;o[2]==&quot;\u002F&quot;&amp;&amp;o[3]==&quot;\u002F&quot;))\n\t\t\t\t\t\tcheck(o[0]+n[0]+o[1]+n[1]+o[2]+n[2]+o[3]+n[3]);\n\t\t\t\t}\n\t\u002F\u002F两端乘除中间加减或者两端加减中间乘除，如（6-2）*（8-2）\n\tfor(var i=1;i&lt;4;i++)\n\t{\n\t\tvar temparr=new Array(0,0,0,0);\n\t\ttemparr=n;\n\t\tvar tempnum=temparr[i];\n\t\ttemparr[i]=temparr[1];\n\t\ttemparr[1]=tempnum;\n\t\tfor(var j1=0;j1&lt;2;j1++)\n\t\t\tfor(var j2=0;j2&lt;2;j2++)\n\t\t\t\tfor(var j3=0;j3&lt;2;j3++)\n\t\t\t\t\tfor(var j4=0;j4&lt;2;j4++)\n\t\t\t\t\t\tfor(var j5=0;j5&lt;2;j5++)\n\t\t\t\t\t\t\tfor(var j6=0;j6&lt;2;j6++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\u002F\u002F先加减后乘除\n\t\t\t\t\t\t\t\to[0]=[&quot;&quot;,&quot;1\u002F&quot;][j1];\n\t\t\t\t\t\t\t\to[1]=[&quot;&quot;,&quot;-&quot;][j2];\n\t\t\t\t\t\t\t\to[2]=[&quot;+&quot;,&quot;-&quot;][j3];\n\t\t\t\t\t\t\t\to[3]=[&quot;*&quot;,&quot;\u002F&quot;][j4];\n\t\t\t\t\t\t\t\to[4]=[&quot;&quot;,&quot;-&quot;][j5];\n\t\t\t\t\t\t\t\to[5]=[&quot;+&quot;,&quot;-&quot;][j6];\n\t\t\t\t\t\t\t\tif(!(o[0]==&quot;1\u002F&quot;&amp;&amp;o[3]==&quot;\u002F&quot;) &amp;&amp; !(o[1]==&quot;-&quot;&amp;&amp;o[2]==&quot;-&quot;) &amp;&amp; !(o[4]==&quot;-&quot;&amp;&amp;o[5]==&quot;-&quot;))\n\t\t\t\t\t\t\t\t\tcheck(o[0]+&quot;(&quot;+o[1]+temparr[0]+o[2]+temparr[1]+&quot;)&quot;+o[3]+&quot;(&quot;+o[4]+temparr[2]+o[5]+temparr[3]+&quot;)&quot;);\n\t\t\t\t\t\t\t\t\u002F\u002F先乘除后加减\n\t\t\t\t\t\t\t\to[0]=[&quot;&quot;,&quot;-&quot;][j1];\n\t\t\t\t\t\t\t\to[1]=[&quot;&quot;,&quot;1\u002F&quot;][j2];\n\t\t\t\t\t\t\t\to[2]=[&quot;*&quot;,&quot;\u002F&quot;][j3];\n\t\t\t\t\t\t\t\to[3]=[&quot;+&quot;,&quot;-&quot;][j4];\n\t\t\t\t\t\t\t\to[4]=[&quot;&quot;,&quot;1\u002F&quot;][j5];\n\t\t\t\t\t\t\t\to[5]=[&quot;*&quot;,&quot;\u002F&quot;][j6];\n\t\t\t\t\t\t\t\tif(!(o[0]==&quot;-&quot;&amp;&amp;o[3]==&quot;-&quot;) &amp;&amp; !(o[1]==&quot;1\u002F&quot;&amp;&amp;o[2]==&quot;\u002F&quot;) &amp;&amp; !(o[4]==&quot;1\u002F&quot;&amp;&amp;o[5]==&quot;\u002F&quot;))\n\t\t\t\t\t\t\t\t\tcheck(o[0]+o[1]+temparr[0]+o[2]+temparr[1]+o[3]+o[4]+temparr[2]+o[5]+temparr[3]);\n\t\t\t\t\t\t\t}\n\t}\n\t\u002F\u002F两次乘除一次加减或者两次加减一次乘除，如3*4*3-12\n\tfor(var i=0;i&lt;4;i++)\n\t{\n\t\tvar temparr=new Array(0,0,0,0);\n\t\ttemparr=n;\n\t\tvar tempnum=temparr[i];\n\t\ttemparr[i]=temparr[3];\n\t\ttemparr[3]=tempnum;\n\t\tfor(var j1=0;j1&lt;2;j1++)\n\t\t\tfor(var j2=0;j2&lt;2;j2++)\n\t\t\t\tfor(var j3=0;j3&lt;2;j3++)\n\t\t\t\t\tfor(var j4=0;j4&lt;2;j4++)\n\t\t\t\t\t\tfor(var j5=0;j5&lt;2;j5++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\u002F\u002F先加减后乘除\n\t\t\t\t\t\t\to[0]=[&quot;&quot;,&quot;1\u002F&quot;][j1];\n\t\t\t\t\t\t\to[1]=[&quot;&quot;,&quot;-&quot;][j2];\n\t\t\t\t\t\t\to[2]=[&quot;+&quot;,&quot;-&quot;][j3];\n\t\t\t\t\t\t\to[3]=[&quot;+&quot;,&quot;-&quot;][j4];\n\t\t\t\t\t\t\to[4]=[&quot;*&quot;,&quot;\u002F&quot;][j5];\n\t\t\t\t\t\t\tif(!(o[1]==&quot;-&quot;&amp;&amp;o[2]==&quot;-&quot;&amp;&amp;o[3]==&quot;-&quot;) &amp;&amp; !(o[0]==&quot;1\u002F&quot;&amp;&amp;o[4]==&quot;\u002F&quot;))\n\t\t\t\t\t\t\t\tcheck(o[0]+&quot;(&quot;+o[1]+temparr[0]+o[2]+temparr[1]+o[3]+temparr[2]+&quot;)&quot;+o[4]+temparr[3]);\n\t\t\t\t\t\t\t\u002F\u002F先乘除后加减\n\t\t\t\t\t\t\to[0]=[&quot;&quot;,&quot;-&quot;][j1];\n\t\t\t\t\t\t\to[1]=[&quot;&quot;,&quot;1\u002F&quot;][j2];\n\t\t\t\t\t\t\to[2]=[&quot;*&quot;,&quot;\u002F&quot;][j3];\n\t\t\t\t\t\t\to[3]=[&quot;*&quot;,&quot;\u002F&quot;][j4];\n\t\t\t\t\t\t\to[4]=[&quot;+&quot;,&quot;-&quot;][j5];\n\t\t\t\t\t\t\tif(!(o[1]==&quot;1\u002F&quot;&amp;&amp;o[2]==&quot;\u002F&quot;&amp;&amp;o[3]==&quot;\u002F&quot;) &amp;&amp; !(o[0]==&quot;-&quot;&amp;&amp;o[4]==&quot;-&quot;))\n\t\t\t\t\t\t\t\tcheck(o[0]+o[1]+temparr[0]+o[2]+temparr[1]+o[3]+temparr[2]+o[4]+temparr[3]);\n\t\t\t\t\t\t}\n\t}\n\t\u002F\u002Falert(count);\n\t\u002F\u002F至此共判断360次，与预期一样\n\t\u002F\u002F乘除一次，加减一次，加减乘除一次，或者反过来，如(（3+4）*3)+3\n\tfor(var i=0;i&lt;4;i++)\n\t\tfor(var j=i+1;j&lt;4;j++)\n\t\t{\n\t\t\tvar temparr=new Array(0,0,0,0);\n\t\t\ttemparr=n;\n\t\t\tvar tempnum=temparr[i];\n\t\t\ttemparr[i]=temparr[0];\n\t\t\ttemparr[0]=tempnum;\n\t\t\ttempnum=temparr[j];\n\t\t\ttemparr[j]=temparr[1];\n\t\t\ttemparr[1]=tempnum;\n\t\t\tfor (var k=2;k&lt;4;k++)\n\t\t\t{\n\t\t\t\ttempnum=temparr[k];\n\t\t\t\ttemparr[k]=temparr[2]\n\t\t\t\ttemparr[2]=tempnum;\n\t\t\t\tfor(var j1=0;j1&lt;2;j1++)\n\t\t\t\t\tfor(var j2=0;j2&lt;2;j2++)\n\t\t\t\t\t\tfor(var j3=0;j3&lt;2;j3++)\n\t\t\t\t\t\t\tfor(var j4=0;j4&lt;2;j4++)\n\t\t\t\t\t\t\t\tfor(var j5=0;j5&lt;2;j5++)\n\t\t\t\t\t\t\t\t\tfor(var j6=0;j6&lt;4;j6++)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\u002F\u002F先加减后乘除再加减\n\t\t\t\t\t\t\t\t\t\to[0]=[&quot;&quot;,&quot;-&quot;][j1];\n\t\t\t\t\t\t\t\t\t\to[1]=[&quot;&quot;,&quot;1\u002F&quot;][j2];\n\t\t\t\t\t\t\t\t\t\to[2]=[&quot;&quot;,&quot;-&quot;][j3];\n\t\t\t\t\t\t\t\t\t\to[3]=[&quot;+&quot;,&quot;-&quot;][j4];\n\t\t\t\t\t\t\t\t\t\to[4]=[&quot;*&quot;,&quot;\u002F&quot;][j5];\n\t\t\t\t\t\t\t\t\t\to[5]=[&quot;+&quot;,&quot;-&quot;,&quot;*&quot;,&quot;\u002F&quot;][j6];\n\t\t\t\t\t\t\t\t\t\tif(!(o[2]==&quot;-&quot;&amp;&amp;o[3]==&quot;-&quot;)&amp;&amp;!(o[1]==&quot;1\u002F&quot;&amp;&amp;o[4]==&quot;\u002F&quot;)&amp;&amp;!(o[0]==&quot;-&quot;&amp;&amp;o[5]==&quot;-&quot;))\n\t\t\t\t\t\t\t\t\t\t\tcheck(o[0]+&quot;(&quot;+o[1]+&quot;(&quot;+o[2]+temparr[0]+o[3]+temparr[1]+&quot;)&quot;+o[4]+temparr[2]+&quot;)&quot;+o[5]+temparr[3]);\n\t\t\t\t\t\t\t\t\t\t\u002F\u002F先乘除后加减再乘除\n\t\t\t\t\t\t\t\t\t\to[0]=[&quot;&quot;,&quot;1\u002F&quot;][j1];\n\t\t\t\t\t\t\t\t\t\to[1]=[&quot;&quot;,&quot;-&quot;][j2];\n\t\t\t\t\t\t\t\t\t\to[2]=[&quot;&quot;,&quot;1\u002F&quot;][j3];\n\t\t\t\t\t\t\t\t\t\to[3]=[&quot;*&quot;,&quot;\u002F&quot;][j4];\n\t\t\t\t\t\t\t\t\t\to[4]=[&quot;+&quot;,&quot;-&quot;][j5];\n\t\t\t\t\t\t\t\t\t\to[5]=[&quot;+&quot;,&quot;-&quot;,&quot;*&quot;,&quot;\u002F&quot;][j6];\n\t\t\t\t\t\t\t\t\t\tif(!(o[2]==&quot;1\u002F&quot;&amp;&amp;o[3]==&quot;\u002F&quot;)&amp;&amp;!(o[1]==&quot;-&quot;&amp;&amp;o[4]==&quot;-&quot;)&amp;&amp;!(o[0]==&quot;1\u002F&quot;&amp;&amp;o[5]==&quot;\u002F&quot;))\n\t\t\t\t\t\t\t\t\t\t\tcheck(o[0]+&quot;(&quot;+o[1]+&quot;(&quot;+o[2]+temparr[0]+o[3]+temparr[1]+&quot;)&quot;+o[4]+temparr[2]+&quot;)&quot;+o[5]+temparr[3]);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t}\n\t}\n\tdocument.getElementById(&quot;result&quot;).innerHTML=document.getElementById(&quot;result&quot;).innerHTML+&quot;共计判断表达式&quot;+count+&quot;次&quot;;\n}\n&lt;\u002Fscript&gt;\n&lt;\u002Fhtml&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n\u003Cp>演示地址已经放到\u003Ca href=\"https:\u002F\u002Frawcdn.githack.com\u002FTooBug\u002Fworks\u002Fgh-pages\u002F24points\u002Findex.html\">https:\u002F\u002Frawcdn.githack.com\u002FTooBug\u002Fworks\u002Fgh-pages\u002F24points\u002Findex.html\u003C\u002Fa>。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n","",{"total":16,"totalRoots":16,"comments":22,"pv":16},[]]