java24点算法

来源:互联网 发布:scp linux 命令 编辑:程序博客网 时间:2024/05/16 08:35

  一天,媳妇突然问我24点算法:-5,-5,5,1怎么算,想了想也没想出来,咱是程序猿,这个问题咱能交给电脑解决,于是写了这个也算是鼓励不大上进的自己吧。

public class Test24 { /**  * @param args  */ public static void main(String[] args) {  int[] numO = {12,12,4,9};  double[] num = {numO[0]*1.0,numO[1]*1.0,numO[2]*1.0,numO[3]*1.0}; //进行四则运算处理小数的情况    //先把运算的四位数放到相应的位置(4!种可能)  for(int i = 0; i < num.length; i++){   for(int temp1 =1,j = 0; temp1 <= 4; temp1++,j++){    if( j == i) continue;    for(int temp2 =1,k = 0; temp2 <= 4; temp2++,k++){     if(k == i || k == j) continue;     for(int temp3 =1,l = 0; temp3 <= 4; temp3++,l++){      if(l == i || l == k || l == j) continue;      print(new double[]{num[i],num[j],num[k],num[l]});     }    }   }  } } /**  * 参与运算的四个数字位置确定了,然后添加三个运算符(4*4*4种可能)  * @param num  */ public static void print(double[] num){  int[] cal = {1,2,3,4};//分别代表+、-、*、/  String[] calS = {"+","-","*","/"};  for(int a = 0; a < cal.length; a++){   for(int b = 0; b < cal.length; b++){    for(int c = 0; c < cal.length; c++){          //由于运算符的优先级的关系,总共有五种可能     // 1.((a+b)+c)+d 2.(a+(b+c))+d 3.a+((b+c)+d) 4.(a+b)+(c+d) 5.a+(b+(c+d))          double result = num[0];     result = cal(cal(cal(result,num[1],cal[a]),num[2],cal[b]),num[3],cal[c]);     if(result == 24.0)      System.out.println("(("+(int)num[0]+calS[a]+(int)num[1]+")"+calS[b]+(int)num[2]+")"+calS[c]+(int)num[3]+"="+(int)result);     result = num[1];     result = cal(cal(num[0],cal(result,num[2],cal[b]),cal[a]),num[3],cal[c]);     if(result == 24.0)      System.out.println("("+(int)num[0]+calS[a]+"("+(int)num[1]+calS[b]+(int)num[2]+"))"+calS[c]+(int)num[3]+"="+(int)result);     result = num[1];     result = cal(num[0],cal(cal(result,num[2],cal[b]),num[3],cal[c]),cal[a]);     if(result == 24.0)      System.out.println((int)num[0]+calS[a]+"(("+(int)num[1]+calS[b]+(int)num[2]+")"+calS[c]+(int)num[3]+")="+(int)result);     result = num[0];     result = cal(cal(result,num[1],cal[a]),cal(num[2],num[3],cal[c]),cal[b]);     if(result == 24.0)      System.out.println("("+(int)num[0]+calS[a]+(int)num[1]+")"+calS[b]+"("+(int)num[2]+calS[c]+(int)num[3]+")="+(int)result);     result = num[2];     result = cal(num[0],cal(num[1],cal(result,num[3],cal[c]),cal[b]),cal[a]);     if(result == 24.0)      System.out.println(+(int)num[0]+calS[a]+"("+(int)num[1]+calS[b]+"("+(int)num[2]+calS[c]+(int)num[3]+"))="+(int)result);    }   }  } } /**  * 对两个数字进行操作  *   通过这个运算,两个数字的运算无形中就是带括号的  * @param result  * @param num  * @param cal  * @return  */ public static double cal(double result,double num,int cal){  switch (cal) {  case 1:   result += num;   break;  case 2:   result -= num;   break;  case 3:   result *= num;   break;  case 4:   result /= num;   break;  default:   break;  }  return result; }}

    这个24点算法缺点是重复的记录数多,主要是两种情况的重复:1.四个数字中有重复数字时 2.因为运算的事情,容易出现看似重复的情况,不过还好,输入四个数字可以得到解决方案。

    第一次写文章,希望大家多多提意见。


0 0
原创粉丝点击