*本程序设计出一个计算方法,用于判断随机给出的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);//使主窗口可见
}
}