1到9加减乘除得到结果等于指定值

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * 对于给出的一个数字N。
 * 找出从1到9这9个数字顺序加减乘除组成的算式,
 * 这些算式的计算结果须恰好为N!
 * @author tiger
 * @date 2010年5月19日于公司
 * 信手而写,极不规范。异日有暇,再行修缮。
 */
public class cumt {

 private Stack stack = new Stack();
 private Stack stack1 = new Stack();
 
 /**
  * 求算式str的结果
  * str必须是正确的算式!
  * str中不能有空格!
  *
  * 用堆栈来执行计算。
  * 第一次,遍历字符串,执行乘除运算,把算式顺序压入堆栈中。
  * 倒置堆栈(借用了第二个堆栈来处理)
  * 第二次,遍历堆栈,执行加减运算。最后得到结果。
  * @return
  */
 private int action(String str)
 {
  int count = 0;
  int type = 0; // 0: 加法,1:减法
  for (int i = 0; i < str.length(); i++) {
   String c = str.substring(i , i+1);
   if(!c.equals("*") && !c.equals("/"))
   {
    stack.push(c);
   }else{
    String c1 = (String) stack.pop();
    int k = Integer.parseInt(str.substring(i + 1 , i+2)) ;
    if(c.equals("*"))
    {
     k = k * Integer.parseInt(c1);
    }else if(c.equals("/"))
    {
     k = Integer.parseInt(c1) / k;
    }
    stack.push(k + "");
    i++;
   }
  }
  
  while(!stack.isEmpty())
  {
   stack1.push(stack.pop());
  }
  
  count = Integer.parseInt((String)stack1.pop());
  while(!stack1.isEmpty()){
   String c = (String)stack1.pop();
   if(c.equals("+") || c.equals("-"))
   {
    type = c.equals("+")? 0: 1;
   }else{
    if(type == 0)
    {
     count += Integer.parseInt(c);
    }else if(type == 1)
    {
     count -= Integer.parseInt(c);
    }
   }
  }
  
  return count;
 }
 
 /**
   * 得到正整数a的4进制表示
   */
  public String getFourString(int a){
   String str1 = "0123";
   String str = "";
   while(a>0){
    int k = a & 0x3;  // 相当于 int k = a % 4;
    str = str1.charAt(k)+str;
    a = a >> 2;       // 相当于 a = a / 4;
   }
   return str;
  }
 
 
  /**
   * 将字符串补足到8位
   * 不足位补0,0为加法运算。
   * 因为很多的数的四进制字符串不足8位。
   */
 private String buzu(String str)
 {
  if(str.length() >= 8)return str;
  String str1 = str;
  while(str1.length() < 8)
  {
   str1 = "0" + str1;
  }
  return str1;
 }
 
 /**
   * 主要逻辑(思路如下:)
   * 通过四进制字符串来得到加减乘除四种运算的全排列字符串
   * 将该字符串与1-9这9个数字合并成算式。共有4的8次方个算式
   * 计算这些算式的结果,如果与目标值相等,打印之!
   */
 private void logic(int abc)
 {
  for (int i = 0; i < Math.pow(4, 8); i++) {
   String str = this.getFourString(i);
   str = this.buzu(str);
   
   String str1 = "1";
   for (int j = 0; j < 8; j++){
    String s = str.charAt(j)+"";
    if(s.equals("0"))
    {
     str1 += "+"+(j+2);
    }else if(s.equals("1"))
    {
     str1 += "-"+(j+2);
    }else if(s.equals("2"))
    {
     str1 += "*"+(j+2);
    }else if(s.equals("3"))
    {
     str1 += "/"+(j+2);
    }
   }
   if(this.action(str1) == abc)
   {
    System.out.println(str1 + "=" + abc);
   }
    
  }
 }
 
 /**
  * 程序入口
  */
 public static void main(String[] args) {
  //test : 求算式
//  String str = "1+2+3+4/5-6-7-8/9";
//  int a = new cumt().action(str);
//  System.out.println(str + "=" + a);
  
  //test : 求4进制
//  String a = new cumt().getFourString(100);
//  System.out.println(a);
  
  new cumt().logic(16);
 }
 
 
}

/*打印结果如下:
 1+2+3+4+5+6+7+8*9=100
 1+2+3-4*5+6*7+8*9=100
 1+2+3*4*5+6*7*8/9=100
 1+2-3*4+5*6+7+8*9=100
 1+2-3*4-5+6*7+8*9=100
 1+2*3+4*5-6+7+8*9=100
 1+2*3+4*5/6*7+8*9=100
 1+2*3*4*5/6+7+8*9=100
 1+2/3+4+5*6+7*8+9=100
 1+2/3+4+5*6-7+8*9=100
 1-2+3*4*5+6*7+8-9=100
 1-2+3*4*5-6+7*8-9=100
 1-2+3*4/5*6*7+8+9=100
 1-2*3+4*5+6+7+8*9=100
 1-2*3-4+5*6+7+8*9=100
 1-2*3-4-5+6*7+8*9=100
 1-2/3+4+5*6+7*8+9=100
 1-2/3+4+5*6-7+8*9=100
 1*2*3+4+5+6+7+8*9=100
 1*2*3-4*5+6*7+8*9=100
 1*2*3*4+5+6+7*8+9=100
 1*2*3*4+5+6-7+8*9=100
 1*2*3*4+5*6/7+8*9=100
*/

 

posted on 2010-05-19 19:33  台哥编程课堂  阅读(8247)  评论(0编辑  收藏  举报

导航