|
蓝森林 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] |
|