现在的位置: 首页 > 综合 > 正文

微软面试题:3,3,8,8,四个数字任意加减乘除使之最后等于24的编程解决方法

2013年08月14日 ⁄ 综合 ⁄ 共 3198字 ⁄ 字号 评论关闭

微软面试题:3,3,8,8,四个数字任意加减乘除使之最后等于24的公式

四个数字,四中操作方式,括号的取舍。。

空间复杂度:4!*A(4,3)*C(8) = 12288次,差不多就计算完了。
用java建个Calculator的类,分别设置属性,4个数字用Set装好,操作方式的集合用list装好,暴力解题。

坑爹啊,算法不好没编出来。

找了个js的方案,如下代码copy到记事本,保存为Calculator.html。直接浏览器运行。
<html>
<head><title>24点</title>
<script language=javascript>
var checkInput=function(){

var no1 = parseFloat(document.forms['form']['no1'].value);
var no2 = parseFloat(document.forms['form']['no2'].value);
var no3 = parseFloat(document.forms['form']['no3'].value);
var no4 = parseFloat(document.forms['form']['no4'].value);
if(isNaN(no1)||no1<=0||no1>=100){
alert("第一个数字非法!,应该输入大于0小于100的数字!");
return;
}else if(isNaN(no2)||no2<=0||no2>=100){
alert("第二个数字非法!,应该输入大于0小于100的数字!");
return;
}else if(isNaN(no2)||no2<=0||no2>=100){
alert("第三个数字非法!,应该输入大于0小于100的数字!");
return;
}else if(isNaN(no2)||no2<=0||no2>=100){
alert("第四个数字非法!,应该输入大于0小于100的数字!");
return;
}else{
calc24([no1,no2,no3,no4]);

};

var calc24=function(nums){
var sign = ['+','-','*','/'];
var expr = new Array(8);
for(i=0;i<4;i++){
for(j=0;j<4;j++){
for(k=0;k<4;k++){
for(m=0;m<4;m++){
for(n=0;n<4;n++){
if(n==m){
continue;
}
for(p=0;p<4;p++){
if(p==m||p==n){
continue;
}
for(q=0;q<4;q++){
if(q==m||q==n||q==p){
continue;
}
expr[1]=sign[i];
expr[6]=nums[p];
expr[7]=nums[q];

expr[0] = 1;
expr[2]=sign[j];
expr[3]=sign[k];
expr[4]=nums[m];
expr[5]=nums[n];
//if(eval(expr)==24){
if(Math.abs(eval(expr)-24)<0.0000001){
expr[0] = 1;
alert(tostring(expr)+'=24');
return;
}
expr[0] = 1;
expr[2]=sign[j];
expr[3]=nums[m];
expr[4]=sign[k];
expr[5]=nums[n];
//if(eval(expr)==24){
if(Math.abs(eval(expr)-24)<0.0000001){
expr[0] = 1;
alert(tostring(expr)+'=24');
return;
}
expr[0] = 1;
expr[2]=sign[j];
expr[3]=nums[m];
expr[4]=nums[n];
expr[5]=sign[k];
//if(eval(expr)==24){
if(Math.abs(eval(expr)-24)<0.0000001){
expr[0] = 1;
alert(tostring(expr)+'=24');
return;
}
expr[0] = 1;
expr[2]=nums[m];
expr[3]=sign[j];
expr[4]=sign[k];
expr[5]=nums[n];
//if(eval(expr)==24){
if(Math.abs(eval(expr)-24)<0.0000001){
expr[0] = 1;
alert(tostring(expr)+'=24');
return;
}
expr[0] = 1;
expr[2]=nums[m];
expr[3]=sign[j];
expr[4]=nums[n];
expr[5]=sign[k];
//if(eval(expr)==24){
if(Math.abs(eval(expr)-24)<0.0000001){
expr[0] = 1;
alert(tostring(expr)+'=24');
return;
}
}
}
}

}
}
}
alert('无解!'); 
};

var eval=function(expr){
var i = expr[0];
expr[0]++;
if(!isNaN(expr[i])){
return expr[i];
}
if(expr[i]=='+'){
return eval(expr)+eval(expr);
}else if(expr[i]=='-'){
return eval(expr)-eval(expr);
}else if(expr[i]=='*'){
return eval(expr)*eval(expr);
}else if(expr[i]=='/'){
return eval(expr)/eval(expr);
}else{
alert('error!');
}
};

var tostring=function(expr){
var i = expr[0];
expr[0]++;
if(!isNaN(expr[i])){
return expr[i];
}else{
if(i>1){
return ('('+tostring(expr)+expr[i]+tostring(expr)+')');
}else{
return (tostring(expr)+expr[i]+tostring(expr));
}
}
};
</script>
</head>
<body>
<form id="form" name="form">
<table>
<tr width="200">
<td width="100">第一个数:</td><td widht="130"><input id="no1" name="no1" size="5"></td>
</tr>
<tr width="200">
<td width="100">第二个数:</td><td widht="130"><input id="no2" name="no2" size="5"></td>
</tr>
<tr width="200">
<td width="100">第三个数:</td><td widht="130"><input id="no3" name="no3" size="5"></td>
</tr>
<tr width="200">
<td width="100">第四个数:</td><td widht="130"><input id="no4" name="no4" size="5"></td>
</tr>
<tr width="200">
<td colspan="2"><input type="button" name="button" value="计算" onclick="javascript:checkInput();"></td>
</tr>
</table>
</form>
</body>
</html>

抱歉!评论已关闭.