4个数四则运算为24(java程序设计)

来源:互联网 发布:php电子商城源码 编辑:程序博客网 时间:2024/05/30 04:17

/*此程序原来我用C++的一种方法写了的,那种方法是比较全面的输出所有的可能,不过很有点复杂,当时写出来很有自信的,不过那种方法不好,后来的算法设计老师给我讲了一种算法,当时觉得没意思,就没再写了,我现在想学用JAVA写程序,这是我写的第一个比较全的JAVA程序,就用那种方法写了,代码如下,算法就不用介绍了,看看应该很清楚,如有疑问,给小弟留言啊*/

import java.io.*;

public class NNumCalculateToM {

final static double PRECISION = 1E-6;
final static int NUM = 4;
final static int RESULT = 24;

static double number[];      
static String[] expression;  

static boolean circule(int n)
{
   if(n == 1)
   {
    if(Math.abs(number[0] - RESULT) < PRECISION)
    {
     System.out.println(expression[0]);
     return true;
    }
    else
    {
     return false;
    }
   }
  
   for(int i=0; i<n; ++i)
    for(int j=i+1; j<n; ++j)
    {
     double numi,numj;
     String expi,expj;
    
     numi = number[i];
     numj = number[j];
     number[j] = number[n-1];
    
     expi = expression[i];
     expj = expression[j];
     expression[j] = expression[n-1];
    
     //加的处理
     if(n > 2)
      expression[i] = "(" + expi + "+" + expj + ")";
     else
      expression[i] = expi + "+" + expj;
     number[i] = numi + numj;
     if(circule(n-1))
      return true;
    
     //减的处理,有两种情况expi-expj,expj-expi
     if(n > 2)
      expression[i] = '(' + expi + '-' + expj + ')';
     else
      expression[i] = expi + '-' + expj;
             number[i] = numi - numj;
             if(circule(n-1))
                 return true;

             if(n > 2)
      expression[i] = '(' + expj + '-' + expi + ')';
     else
      expression[i] = expj + '-' + expi;
             number[i] = numj - numi;
             if(circule(n-1))
                 return true;
            
             //乘的处理
     expression[i] = expi + "*" + expj;
     number[i] = numi * numj;
     if(circule(n-1))
      return true;
    
     //除的处理,有两种情况expi/expj,expj/expi
     if(numj > PRECISION)
     {
      expression[i] = expi + '/' + expj;
              number[i] = numi / numj;
              if(circule(n-1))
                  return true;
     }
    
     if(numi > PRECISION)
     {
      expression[i] = expj + '/' + expi;
              number[i] = numj / numi;
              if(circule(n-1))
                  return true;
     }
    
     //恢复数组
     number[i] = numi;
     number[j] = numj;
     expression[i] = expi;
     expression[j] = expj;
    
    }
  
   return false;
}

static void input() throws IOException
{
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  
   for(int i=0; i<NUM; ++i)
   {
    System.out.println("输入第" + (i+1) + "个数:");
    expression[i] = reader.readLine();
    number[i] = Double.parseDouble(expression[i]);
   }
}

public static void main(String[] args)
{
   // TODO 自动生成方法存根
   number = new double[NUM];
   expression = new String[NUM];
  
   try
   {
    input();
   }
   catch(Exception e)
   {
    System.out.println(e.toString());
   }
  
   if(circule(NUM))
   {
    System.out.println("找到了上述的匹配式子!");
   }
   else
   {
    System.out.println("找不出匹配的式子!");
   }
}

}