*本程序设计出一个计算方法,用于判断随机给出的4个整数是否可以组合计算出24。
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/*类f用于创建一个可以操作的窗口界面,其中包括四个可编辑的文本框,一个“判断”按钮,一个“清空”按钮,一个不可编辑的文本框;
四个可编辑的文本框用于输入四个用于判断的整数;
“判断”按钮用于开始判断;
不可编辑的文本框用于存放之前每次判断的结果;
“清空”按钮用于清空不可编辑文本框当中的内容;
*/

class F extends JFrame{

public static final double EPISON=1E-6;           //在该误差以内,认为两个实数相等
   private static String[] exp=new String[4];        //存放计算的表达式串
   private static double[] number=new double[4];     //四个实数,计算24点,因为可能有小数

// JTextField []text=new JTextField[4];
private JTextField text1=new JTextField("数一",30);//创建4个可编辑的文本框
private JTextField text2=new JTextField("数二",30);
private JTextField text3=new JTextField("数三",30);
private JTextField text4=new JTextField("数四",30);
private JTextArea text=new JTextArea("结果显示在这里:\n\n",5,10);//创建一个不可编辑的文本框
JButton a=new JButton("判断");//创建一个‘判断’按钮
JButton b=new JButton("清空");//创建一个‘清空’按钮

public F(){
setTitle("计算24点");
setSize(400,250);
Container g=getContentPane();//创建一个容器
g.setLayout(null);//将容器的布局设为空
JScrollPane jsp=new JScrollPane();//创建滚动容器

text1.setBounds(20,20,60,30);//将文本框确定位置
text2.setBounds(20,70,60,30);
text3.setBounds(20,120,60,30);
text4.setBounds(20,170,60,30);
text.setEditable(false);
jsp.setBounds(180,20,200,180);
jsp.getViewport().add(text);
a.setBounds(100,60,60,30);//将“判断”按钮确定位置
b.setBounds(100,130,60,30);//将“清空”按钮确定位置
g.add(jsp);
g.add(text1);//将文本框添加到容器中
g.add(text2);
g.add(text3);
g.add(text4);
g.add(a);//将按钮添加到容器中
g.add(b);
a.addActionListener(new AL());//为按钮加上监听器
b.addActionListener(new AL());
addWindowListener(new WL());//加上窗口监听器
}
    
class AL implements ActionListener{
public boolean is24(int n){
   if(n==1) return (Math.abs(number[0]-24)<EPISON);
      for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){                        //进行组合
          double a,b;
          String expa,expb;
          a=number[i];                                 //保存起来,在方法最后再恢复,以便继续计算
          b=number[j];                                 //保存起来,在方法最后再恢复,以便继续计算
          number[j]=number[n-1];                       //将最后一个数挪过来
          expa=exp[i];                                 //保存起来,在方法最后再恢复,以便继续计算
          expb=exp[j];                                 //保存起来,在方法最后再恢复,以便继续计算
          exp[j]=exp[n-1];                             //将最后一个式子挪过来
          exp[i]="("+expa+"+"+expb+")";                //看看加法能否算出
          number[i]=a+b;
          if (is24(n-1)) return true;
          exp[i]="("+expa+"-"+expb+")";                //看看减法能否算
          number[i]=a-b;
          if (is24(n-1)) return true;
          exp[i]="("+expb+"-"+expa+")";
          number[i]=b-a;
          if (is24(n-1)) return true;
          exp[i]="("+expa+"*"+expb+")";                //看看乘法能否算
          number[i]=a*b;
          if (is24(n-1)) return true;
          if(b!=0){
            exp[i]="("+expa+"/"+expb+")";              //看看除法能否算
            number[i]=a/b;
            if (is24(n-1)) return true;
          }
          if(a!=0){
            exp[i]="("+expb+"/"+expa+")";
            number[i]=b/a;
            if (is24(n-1)) return true;
          }
          number[i]=a;                                  //恢复
          number[j]=b;
          exp[i]=expa;
          exp[j]=expb;
        }
   }
   return false;
}

public void actionPerformed(ActionEvent e){
    
if(e.getSource()==a){
exp[0]=text1.getText();
exp[1]=text2.getText();
exp[2]=text3.getText();
exp[3]=text4.getText();
number[0]=Integer.parseInt(text1.getText());
number[1]=Integer.parseInt(text2.getText());
number[2]=Integer.parseInt(text3.getText());
number[3]=Integer.parseInt(text4.getText());
text.append("四个数分别为:"+(int)number[0]+" "+(int)number[1]+" "+(int)number[2]+" "+(int)number[3]+"\n");
if(number[0]*number[1]*number[2]*number[3]==0)
    text.append("请确保四个数中没有0"+"\n\n");
else{
    text1.setText("");
    text2.setText("");
    text3.setText("");
    text4.setText("");
    if(is24(4)){
           text.append("能计算"+"\n");
           text.append(exp[0]+"\n\n");
         }else
           text.append("不能计算\n\n");
       }
}

if(e.getSource()==b) text.setText("结果显示在这里:\n\n");
    } 
}

class WL extends WindowAdapter{
    public void windowClosing(WindowEvent e){System.exit(0);}//关闭主窗口
}
}

public class C24{
public static void main(String[]args){
   JFrame f=new F();
   f.setResizable(false);
   f.setLocation(300,100);
   f.setVisible(true);//使主窗口可见
}
}

  

posted on 2012-04-20 09:10  qqfc650  阅读(928)  评论(0编辑  收藏  举报