下沙论坛

 找回密码
 注册论坛(EC通行证)

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 3182|回复: 16
打印 上一主题 下一主题

算24点

[复制链接]
  • TA的每日心情

    2015-1-6 15:11
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    跳转到指定楼层
    1
    发表于 2007-4-4 12:44:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩

    该用户从未签到

    2
    发表于 2007-4-4 12:45:00 | 只看该作者
    。。。3547
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3
    发表于 2007-4-4 12:46:00 | 只看该作者
    某人很能算的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2015-1-6 15:11
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    4
     楼主| 发表于 2007-4-4 12:49:00 | 只看该作者
    , t* I0 [! z! K1 G! L' E' n) [
    [此贴子已经被作者于2007-4-4 12:52:25编辑过]
    # A2 e5 o2 I n
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5
    发表于 2007-4-4 12:50:00 | 只看该作者
    死细胞的....
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6
    发表于 2007-4-4 12:51:00 | 只看该作者
    。。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-9-18 11:11
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    7
    发表于 2007-4-4 12:52:00 | 只看该作者
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2015-1-6 15:11
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    8
     楼主| 发表于 2007-4-4 12:54:00 | 只看该作者
    //牌初始显示
    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;
     }
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2015-1-6 15:11
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    9
     楼主| 发表于 2007-4-4 12:55:00 | 只看该作者

    不是我写的,仅仅只是看的懂一部分,,感谢网友ybzjllj / Q6 \0 }" g0 s. \

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10
    发表于 2007-4-4 22:01:00 | 只看该作者

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

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11
    发表于 2007-4-4 22:10:00 | 只看该作者

    4个数算24

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

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12
    发表于 2007-4-4 22:38:00 | 只看该作者

    真长啊....

    没有特别需要的话...

    用basic不是更简洁?

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13
    发表于 2007-4-5 03:28:00 | 只看该作者
    额。。。。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2014-6-10 16:23
  • 签到天数: 1 天

    [LV.1]初来乍到

    14
    发表于 2007-4-5 07:45:00 | 只看该作者
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    15
    发表于 2007-4-5 08:51:00 | 只看该作者
    伤脑筋啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16
    发表于 2007-4-5 10:44:00 | 只看该作者
    (5-1/5)*5=24
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17
    发表于 2007-4-5 10:52:00 | 只看该作者
    传说中的算牌器
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    下沙大学生网推荐上一条 /1 下一条

    快速回复 返回顶部 返回列表