下沙论坛

标题: 算24点 [打印本页]

作者: 熊猫    时间: 2007-4-4 12:44
标题: 算24点

作者: 天堂伞    时间: 2007-4-4 12:45
。。。3547
作者: 叶碧溪    时间: 2007-4-4 12:46
某人很能算的
作者: 熊猫    时间: 2007-4-4 12:49
& s- o+ B2 l+ m+ `5 a
[此贴子已经被作者于2007-4-4 12:52:25编辑过]
8 |! O) l9 O* ]; H
作者: ︶ㄣ比目鱼︶ㄣ    时间: 2007-4-4 12:50
死细胞的....
作者: 叶碧溪    时间: 2007-4-4 12:51
。。。。
作者: №西远£訷話    时间: 2007-4-4 12:52

作者: 熊猫    时间: 2007-4-4 12:54
//牌初始显示
p1.gotoAndStop(5);
p2.gotoAndStop(18);
p3.gotoAndStop(31);
//表达式计算
ebtn.onPress = function() {
 out2.text = evalString(input2.text);
};
//随机产生四个数
RandBtn.onRelease = function() {
 //预存52张牌,不含王。
 var p54:Array=[1,2,3,4,5,6,7,8,9,10,14,15,16,17,18,19,20,21,22,23,27,28,29,30,31,32,33,34,35,36,40,41,42,43,44,45,46,47,48,49];
 //抽四张牌
 var p4:Array=[];
 for(var i=0;i<4;i++){
  p4.push(p54.splice(random(p54.length),1)[0]);
 }
 //牌显示
 for(var i=0;i<p4.length;i++){
  _root["p"+(i+1)].gotoAndStop(p4);
 }
 //数据显示
 input.text =p4[0]%13 +","+p4[1]%13+","+p4[2]%13+","+p4[3]%13;
};
//计算按钮
evalBtn.onRelease = function() {
 var inStr:String = input.text;
 //删除字串中的空格
 var i = 0;
 while (true) {
  i = inStr.indexOf(" ", i);
  if (i == -1) {
   break;
  }
  inStr = inStr.slice(0, i)+inStr.slice(i+1);
 }
 var N4:Array = inStr.split(",");
 //以“,”号撤分
 var Lok = eval24(N4);
 out.text = "";
 if (Lok.length == 0) {
  out.text = "我没算出来!";
 } else {
  for (var i = 0; i<Lok.length; i++) {
   out.text += Lok+"\n";
  }
 }
};
//计算函数
function eval24(Num4:Array) {
 var Num4i;
 var Num4j;
 var Num4k;
 var Num4m;
 var res1:Array = [];
 var res2:Array = [];
 for (var i = 0; i<4; i++) {
  Num4i = Number(Num4);
  for (var j = 0; j<4; j++) {
   if (i != j) {
    Num4j = Number(Num4[j]);
    var PArray1:Array = [];
    var PArray2:Array = [];
    //A任取两个数运算
    Array1.push(Num4i+Num4j);
    Array2.push("("+Num4i+"+"+Num4j+")");
    Array1.push(Num4i-Num4j);
    Array2.push("("+Num4i+"-"+Num4j+")");
    Array1.push(Num4j-Num4i);
    Array2.push("("+Num4j+"-"+Num4i+")");
    Array1.push(Num4i*Num4j);
    Array2.push("("+Num4i+"*"+Num4j+")");
    Array1.push(Num4i/Num4j);
    Array2.push("("+Num4i+"/"+Num4j+")");
    PArray1.push(Num4j/Num4i);
    PArray2.push("("+Num4j+"/"+Num4i+")");
    for (var k = 0; k<4; k++) {
     if (j != k && i != k) {
      Num4k = Number(Num4[k]);
      for (var m = 0; m<4; m++) {
       if (k != m && j != m && i != m) {
        Num4m = Number(Num4[m]);
        var kArray1:Array = [];
        var kArray2:Array = [];
        //B剩下两个数的运算
        kArray1.push(Num4k+Num4m);
        kArray2.push("("+Num4k+"+"+Num4m+")");
        kArray1.push(Num4k-Num4m);
        kArray2.push("("+Num4k+"-"+Num4m+")");
        kArray1.push(Num4m-Num4k);
        kArray2.push("("+Num4m+"-"+Num4k+")");
        kArray1.push(Num4k*Num4m);
        kArray2.push("("+Num4k+"*"+Num4m+")");
        kArray1.push(Num4k/Num4m);
        kArray2.push("("+Num4k+"/"+Num4m+")");
        kArray1.push(Num4m/Num4k);
        kArray2.push("("+Num4m+"/"+Num4k+")");
        for (var a = 0; a<PArray1.length; a++) {
         for (var b = 0; b<kArray1.length; b++) {
          //(A#B)#(C#D)
          res1.push(PArray1[a]+kArray1);
          res2.push(PArray2[a]+"+"+kArray2);
          res1.push(PArray1[a]-kArray1);
          res2.push(PArray2[a]+"-"+kArray2);
          res1.push(kArray1-PArray1[a]);
          res2.push(kArray2+"-"+PArray2[a]);
          res1.push(PArray1[a]*kArray1);
          res2.push(PArray2[a]+"*"+kArray2);
          res1.push(PArray1[a]/kArray1);
          res2.push(PArray2[a]+"/"+kArray2);
          res1.push(kArray1/PArray1[a]);
          res2.push(kArray2+"/"+PArray2[a]);
         }
        }
       }
      }
     }
    }
    //((A#B)#C)#D
    for (var k = 0; k<4; k++) {
     if (j != k && i != k) {
      Num4k = Number(Num4[k]);
      for (var l = 0; l<PArray1.length; l++) {
       var kArray1:Array = [];
       var kArray2:Array = [];
       kArray1.push(PArray1[l]+Num4k);
       kArray2.push("("+PArray2[l]+"+"+Num4k+")");
       kArray1.push(PArray1[l]-Num4k);
       kArray2.push("("+PArray2[l]+"-"+Num4k+")");
       kArray1.push(Num4k-PArray1[l]);
       kArray2.push("("+Num4k+"-"+PArray2[l]+")");
       kArray1.push(PArray1[l]*Num4k);
       kArray2.push("("+PArray2[l]+"*"+Num4k+")");
       kArray1.push(PArray1[l]/Num4k);
       kArray2.push("("+PArray2[l]+"/"+Num4k+")");
       kArray1.push(Num4k/PArray1[l]);
       kArray2.push("("+Num4k+"/"+PArray2[l]+")");
       for (var m = 0; m<4; m++) {
        if (k != m && j != m && i != m) {
         Num4m = Number(Num4[m]);
         for (var n = 0; n<kArray1.length; n++) {
          res1.push(kArray1[n]+Num4m);
          res2.push(kArray2[n]+"+"+Num4m);
          res1.push(kArray1[n]-Num4m);
          res2.push(kArray2[n]+"-"+Num4m);
          res1.push(Num4m-kArray1[n]);
          res2.push(Num4m+"-"+kArray2[n]);
          res1.push(kArray1[n]*Num4m);
          res2.push(kArray2[n]+"*"+Num4m);
          res1.push(kArray1[n]/Num4m);
          res2.push(kArray2[n]+"/"+Num4m);
          res1.push(Num4m/kArray1[n]);
          res2.push(Num4m+"/"+kArray2[n]);
         }
        }
       }
      }
     }
    }
   }
  }
 }
 var retArray:Array = [];
 for (var m = 0; m<res2.length; m++) {
  //if (Number(res1[m])>=23.99 && Number(res1[m])<=24.01) {
  if (res1[m] == 24) {
   var ok:Boolean = true;
   for (var i = 0; i<retArray.length; i++) {
    if ((res2[m]+"="+res1[m]) == retArray) {
     ok = false;
    }
   }
   if (ok) {
    retArray.push(res2[m]+"="+res1[m]);
   }
  }
 }
 return retArray;
}
//计算字串表达式的值
//参数:字串计算表达式,只能有数字(可以是小数和负数),+ - * / ( )等符号,自动忽略空格。
function evalString(表达式:String):Number {
 //删除字串中的空格
 var i = 0;
 while (true) {
  i = 表达式.indexOf(" ", i);
  if (i == -1) {
   break;
  }
  表达式 = 表达式.slice(0, i)+表达式.slice(i+1);
 }
 var 堆栈:Array = ["@"];
 //栈底标记"@"
 var a, b, c, d:String, Err:String = "ok";
 var _fh = 1;
 //正负号
 var posN = "";
 // 扫描表达式
 for (var i = 0; i<表达式.length; i++) {
  switch (表达式.charAt(i)) {
  case "(" :
   //左括号前面是数字,就插入乘号,否则就直接入栈。即左括号前的乘号可以省略。
   d = 表达式.charAt(i-1);
   if ((d>"0" && d<"9") || d == ")") {
    堆栈.push("*");
   }
   堆栈.push(表达式.charAt(i));
   break;
  case ")" :
   //右括号则退栈计算,直到遇见一个左括号
   b = 堆栈.pop();
   c = 堆栈.pop();
   a = 堆栈.pop();
   if (堆栈.pop() == "(") {
    堆栈.push(计算两数(a, c, b));
   } else {
    //请拖动“组件”Alert到舞台上,然后删除,它就出现在库中了
    //这样才能利用下面的弹出提示信息窗口。
    mx.controls.Alert.show("括号不匹配!", "表达式错误");
    return Number("");
   }
   break;
  case "*" :
  case "/" :
   //如果前一个运算符为*或/,则退栈计算,再入栈,否则直接入栈
   d = 堆栈[堆栈.length-2];
   if (d == "*" || d == "/") {
    b = 堆栈.pop();
    c = 堆栈.pop();
    a = 堆栈.pop();
    堆栈.push(计算两数(a, c, b));
   }
   堆栈.push(表达式.charAt(i));
   break;
  case "-" :
   //判断是减号?还是负号?
   d = 表达式.charAt(i-1);
   if (i == 0 || d == "(" || d == "/" || d == "*") {
    _fh = -1;
    break;
   }
  case "+" :
   //如果前一个运算符不是左括号也不是栈底,则退栈计算,再入栈
   d = 堆栈[堆栈.length-2];
   if (d != "(" && d != "@") {
    b = 堆栈.pop();
    c = 堆栈.pop();
    a = 堆栈.pop();
    堆栈.push(计算两数(a, c, b));
   }
   堆栈.push(表达式.charAt(i));
   break;
  default :
   //如果是数字字符或者小数点则转化为数字
   posN += 表达式.charAt(i);
   //如果下一个字符是运算符则把当前数字压入栈中
   d = 表达式.charAt(i+1);
   if (!(d != "." && (d>"9" || d<"0"))) {
    break;
   }
   堆栈.push(parseFloat(posN)*_fh);
   posN = "";
   _fh = 1;
  }
 }
 //扫描完毕,计算栈中乘下数据
 do {
  b = 堆栈.pop();
  c = 堆栈.pop();
  a = 堆栈.pop();
  堆栈.push(计算两数(a, c, b));
 } while (堆栈.length>3);
 var ret = Number(堆栈.pop());
 if (Err == "除数为零") {
  mx.controls.Alert.show("除数为零!", "错误:");
 } else if (堆栈.pop() != "@" || isNaN(ret)) {
  mx.controls.Alert.show("请检查计算表达式!", "错误:");
 }
 //返回结果 
 return ret;
 //计算两个数
 function 计算两数(a, 运算符, b):Number {
  var ret = 0;
  if (运算符 == "+") {
   ret = a+b;
  } else if (运算符 == "-") {
   ret = a-b;
  } else if (运算符 == "*") {
   ret = a*b;
  } else if (运算符 == "/") {
   if (!b) {
    Err = "除数为零";
    return Number("");
   } else {
    ret = a/b;
   }
  }
  return ret;
 }
}

作者: 熊猫    时间: 2007-4-4 12:55

不是我写的,仅仅只是看的懂一部分,,感谢网友ybzjllj 4 g2 G: m5 S. Z


作者: 冰封爱    时间: 2007-4-4 22:01

有几段素废的。。还可以再简洁一点。。。


作者: 猴子很忙    时间: 2007-4-4 22:10

4个数算24

貌似大二的时候用C写过,递归一下,用不了几行


作者: 荷兰猪    时间: 2007-4-4 22:38

真长啊....

没有特别需要的话...

用basic不是更简洁?


作者: ⒎哖以後    时间: 2007-4-5 03:28
额。。。。。。
作者: 半只菜青虫    时间: 2007-4-5 07:45

作者: 捣蛋鬼    时间: 2007-4-5 08:51
伤脑筋啊
作者: 卑小鄙    时间: 2007-4-5 10:44
(5-1/5)*5=24
作者: fimqad    时间: 2007-4-5 10:52
传说中的算牌器




欢迎光临 下沙论坛 (http://bbs.xiasha.cn/) Powered by Discuz! X3.3