蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程


    

蓝森林 http://www.lslnet.com 2006年8月25日 8:28

JS求解数学题!!!!!

在网上发现一道数学题,想试着用JS来求求解,但是没有什么思路,好像我想复杂了。
题目是这样的:
[color=Red][ ][ ]*[ ]-[ ]-[ ]=[ ]*[ ][ ]-[ ][/color]
上式每个空中只能填1到9中的任意一个数,且不能重复。
如何填才能使等式成立?
[ ]代表一个数,[ ][ ]代表两个数

望各位达人指点算法!!!感激不尽!!:)

偶想法:把9个数排列一下,代到题目中求值,然后比较两边的值
应该是效率比较低的了~

循环到浏览器没有响应。有没有经典些的思路。
各位大虾。。。

[html]
<script>
// A  B   C   D   E   F   G  H   I
//[ ][ ]*[ ]-[ ]-[ ]=[ ]*[ ][ ]-[ ]
//上式每个空中只能填1到9中的任意一个数,且不能重复。
//[ ]代表一个数,[ ][ ]代表两个数
function test(){
  var n=[1,2,3,4,5,6,7,8,9]
  var b=new Array();
  for(var i=0;i<9;i++)
  {
        var t1=new Array(n);
        b[0]=n[i];
        t1.splice(i);
        for(var i2=0;i2<8;i2++)
        {
                var t2=new Array(t1);
                b[1]=t2[i2];
                t2.splice(i2);
                for(var i3=0;i3<7;i3++)
                {
                        var t3=new Array(t2);
                        b[2]=t3[i3];
                        t3.splice(i3);
                        for(var i4=0;i4<6;i4++)
                        {
                                var t4=new Array(t3);
                                b[3]=t4[i4];
                                t4.splice(i4);
                                for(var i5=0;i5<5;i5++)
                                {
                                        var t5=new Array(t4);
                                        b[4]=t5[i5];
                                        t5.splice(i5);
                                        for(var i6=0;i6<4;i6++)
                                        {
                                                var t6=new Array(t5);
                                                b[5]=t6[i6];
                                                t6.splice(i6);
                                                for(var i7=0;i7<3;i7++)
                                                {
                                                        var t7=new Array(t6);
                                                        b[6]=t7[i7];
                                                        t7.splice(i7);
                                                        for(var i8=0;i8<2;i8++)
                                                        {
                                                                var t8=new Array(t7);
                                                                b[7]=t8[i8];
                                                                t8.splice(i8);
                                                                b[8]=t8[0];
                                                                var L = (b[0]*10+b[1])*b[2]-b[3]-b[4]
                                                                var R = b[5]*(b[6]*10+b[7])-b[8]
                                                                if(L==R)
                                                                return b;
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }

  }
}
alert(test());
</script>

[/html]
结果居然是找不到。哎。。。。是不是写错了。。郁闷


16×5-9-7 = 3×24-8

怎么算出来的?????????????????????????
思路是什么

[html]
<script type="text/javascript">

var used=new Array(10),fillin=new Array(10);
for(i=1;i<=9;i++) used[i]=false;

function clt(n){
  if(n==10){
    if((fillin[1]*10+fillin[2])*fillin[3]-(fillin[4]*10+fillin[5])*fillin[6]==fillin[7]+fillin[8]-fillin[9]){
      document.write(''+fillin[1]+fillin[2]+'*'+fillin[3]+'-'+fillin[7]+'-'+fillin[8]);
      document.writeln('='+fillin[6]+'*'+fillin[4]+fillin[5]+'-'+fillin[9]+'<br />');
    }
  } else if(n!=7 || ((fillin[1]*10+fillin[2])*fillin[3]-(fillin[4]*10+fillin[5])*fillin[6]<=16)){
    var i;
    for(i=1;i<=9;i++){
      if(!used[i]){
        used[i]=true;
        fillin[n]=i;
        clt(n+1);
        used[i]=false;
      }
    }
  }
}

clt(1);

</script>
[/html]
要求出全部解,也得6-7秒,没有非常好的方法,用穷举,并作一些剪枝.
如果穷举全部,要9!=362880次
如果把等式变形,[][]*[]-[][]*[]=[]+[]-[],
很容易看出,右边最大值为9+8-1=16,也就是说,只要穷举前6位(6!=720次),当满足等式左边<=16才继续,
实际举到第九位的189888次.

我写的, 只能做反面教材了!

[html]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Untitled Document</TITLE>
<SCRIPT language="JavaScript" type="text/JavaScript">
function math2() {
        target = document.getElementById("result");
        var intL1 = 11, intL2 = 1, intL3 = 1, intL4 = 1;
        var intR1 = 1, intR2 = 11, intR3 = 1;
        for (intL1 = 11; intL1 <100; intL1++) {
                if (intL1 % 10 == 0) {
                        continue;
                }
                for (intL2 = 1; intL2 < 10; intL2++) {
                        for(intL3 = 1; intL3 < 10; intL3++) {
                                for(intL4 = 1; intL4 < 10; intL4++) {
                                        for(intR1 = 1; intR1 < 10; intR1++) {
                                                for (intR2 = 11; intR2 < 100; intR2++) {
                                                        if (intR2 % 10 == 0) {
                                                                continue;
                                                        }
                                                        for (intR3 = 1; intR3 < 10; intR3++) {
                                                                if (intL1 * intL2 - intL3 - intL4 == intR1 * intR2 - intR3) {
                                                                        var arrTemp = new Array(intL1.toString().charAt(0), intL1.toString().charAt(1), intL2, intL3, intL4, intR1, intR2.toString().charAt(0), intR2.toString().charAt(1), intR3);
                                                                        var needReturn = false;
                                                                        for (var i = 0; i < arrTemp.length - 1; i++) {
                                                                                for (var j = 1; j < arrTemp.length; j++) {
                                                                                        if (arrTemp[i] == arrTemp[j]) {
                                                                                                needReturn = true;
                                                                                        }
                                                                                }
                                                                        }
                                                                        if (needReturn) {
                                                                                continue;
                                                                        }
                                                                        p = document.createElement("p");
                                                                        p.appendChild(document.createTextNode(intL1 + "*" + intL2 + "-" + intL3 + "-" + intL4 + "==" + intR1 + "*" + intR2 + "-" + intR3));
                                                                        target.appendChild(p);
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
        alert('End');
}
</SCRIPT>
</HEAD>

<BODY onLoad="math2();">
<DIV id="result"></DIV>
</BODY>
</HTML>

[/html]




Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com