24点计算器。
精简版:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf8" /><script type="text/javascript">function $(id){return document.getElementById(id)}window.οnlοad=i;function i(){$('c').οnclick=c}function c(){var n=$('n').value;$('a').innerHTML="正在计算";var q=n.split(" ");if(q.length!=4){alert("您的输入有误");return}var w=new Array(q.length);for(var i=0;i<q.length;i++){w[i]=i}var n=f(q.length);var o=['+','-','*','/'];var s="";for(var i=1;i<=n;i++){for(var j=0;j<4;j++){for(var k=0;k<4;k++){for(var l=0;l<4;l++){var a=q[w[0]];var b=q[w[1]];var c=q[w[2]];var d=q[w[3]];s=a+o[j]+b+o[k]+c+o[l]+d;if(y(s)=='s')return;s='('+a+o[j]+b+')'+o[k]+c+o[l]+d;if(y(s)=='s')return;s=a+o[j]+'('+b+o[k]+c+')'+o[l]+d;if(y(s)=='s')return;s='('+a+o[j]+b+o[k]+c+')'+o[l]+d;if(y(s)=='s')return;s='('+a+o[j]+b+')'+o[k]+'('+c+o[l]+d+')';if(y(s)=='s')return;s='(('+a+o[j]+b+')'+o[k]+c+')'+o[l]+d;if(y(s)=='s')return;s='('+a+o[j]+'('+b+o[k]+c+'))'+o[l]+d;if(y(s)=='s')return;s=a+o[j]+'(('+b+o[k]+c+')'+o[l]+d+')';if(y(s)=='s')return;s=a+o[j]+'('+b+o[k]+'('+c+o[l]+d+'))';if(y(s)=='s')return}}}w=p(w)}$('a').innerHTML="无解"}function y(s){try{if(window.eval(s)>23.999999&&window.eval(s)<24.000001){$('a').innerHTML=s;return's'}}catch(e){}}function f(n){if(n==2){return 2}else{return n*f(n-1)}}function p(w){var length=w.length;var i=0;for(i=length-1;i>0;i--){if(w[i-1]<w[i]){break}}if(i==0){return w}var j=0;for(j=length-1;j>i;j--){if(w[j]>w[i-1]){break}}var tmp=w[i-1];w[i-1]=w[j];w[j]=tmp;while(i<length-1){tmp=w[i];w[i]=w[length-1];w[length-1]=tmp;i++;length--}return w}</script></head><body>请输入四个数字,数字用单个空格分割。例:"1 2 3 4"。<br><br>输入:<input type="text" id="n" /><input type="button" id="c" value="计算" /><p id="a"></p></body></html>
页面:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
<script src="24.js"></script>
</head>
<body>
请输入四个数字,数字用空格分割。例:"1 2 3 4"。<br><br>
输入:<input type="text" id="numbers" /><input type="button" id="calc" value="计算" />
<p id="answer"></p>
</body>
</html>
javascript:
function $(id){ return document.getElementById(id); } window.οnlοad=init; function init(){ $('calc').οnclick=click; } function click(){ var numbertext=$('numbers').value; $('answer').innerHTML="正在计算"; var arrNum=numbertext.split(" "); // alert(arrNum); //校验 if(arrNum.length!=4){ alert("您的输入有误"); return; } //初始化字典数组 // var indexarray=[0,1,2,3]; var indexarray=new Array(arrNum.length); for(var i=0;i<arrNum.length;i++){ indexarray[i]=i; } //阶乘 var n=24; var n=factorial(arrNum.length); var o=['+','-','*','/']; var str_calc=""; //开始计算 for(var i=1;i<=n;i++){ for(var j=0;j<4;j++){ for(var k=0;k<4;k++){ for(var l=0;l<4;l++){ var a=arrNum[indexarray[0]]; var b=arrNum[indexarray[1]]; var c=arrNum[indexarray[2]]; var d=arrNum[indexarray[3]]; str_calc=a+o[j]+b+o[k]+c+o[l]+d; if(calc24(str_calc)=='s')return ; str_calc='('+a+o[j]+b+')'+o[k]+c+o[l]+d; if(calc24(str_calc)=='s')return ; str_calc=a+o[j]+'('+b+o[k]+c+')'+o[l]+d; if(calc24(str_calc)=='s')return ; str_calc='('+a+o[j]+b+o[k]+c+')'+o[l]+d; if(calc24(str_calc)=='s')return ; str_calc='('+a+o[j]+b+')'+o[k]+'('+c+o[l]+d+')'; if(calc24(str_calc)=='s')return ; str_calc='(('+a+o[j]+b+')'+o[k]+c+')'+o[l]+d; if(calc24(str_calc)=='s')return ; str_calc='('+a+o[j]+'('+b+o[k]+c+'))'+o[l]+d; if(calc24(str_calc)=='s')return ; str_calc=a+o[j]+'(('+b+o[k]+c+')'+o[l]+d+')'; if(calc24(str_calc)=='s')return ; str_calc=a+o[j]+'('+b+o[k]+'('+c+o[l]+d+'))'; if(calc24(str_calc)=='s')return ; } } } indexarray=pai(indexarray); } $('answer').innerHTML="无解"; } function calc24(str_calc){ try{ if(window.eval(str_calc)>23.999999 && window.eval(str_calc)<24.000001){ $('answer').innerHTML=str_calc; return 's'; } }catch(e){ } } function factorial(n){ if(n==2){ return 2; }else{ return n*factorial(n-1); } } function pai(indexarray){ var length = indexarray.length; //第一步,寻找最后一个正序,寻找方法:从后向前找。 var i = 0; for (i = length - 1; i > 0; i--) { if (indexarray[i - 1] < indexarray[i]) {// 则array[i-1],array[i]即为一个正序。 break; } } //如果没找到,也就是到了最后的一个。 if(i==0){ return indexarray; } // 第二步,从后往前找一个比array[i-1]大的第一个数字。 var j = 0; for (j = length - 1; j > i; j--) { if (indexarray[j] > indexarray[i - 1]) { break; } } // 第三部,交换array[i-1],array[j] var tmp = indexarray[i - 1]; indexarray[i - 1] = indexarray[j]; indexarray[j] = tmp; // 最后一步,把i-1后面(从i-2开始至length-1)的序列反序。 // 反序 while (i < length - 1) { tmp = indexarray[i]; indexarray[i] = indexarray[length - 1]; indexarray[length - 1] = tmp; i++; length--; } //反序完毕即即一次排列结束。 return indexarray; }