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

来源:互联网 发布:链家端口费多少 编辑:程序博客网 时间:2024/05/22 07:55

微软面试题: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>


原创粉丝点击