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