zoukankan      html  css  js  c++  java
  • 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
    */

  • 相关阅读:
    windows 动态库的封装以及调用
    ffmpeg 转码命令与ffplay
    YUV格式与RGB格式
    Qt QTimer
    Qt QLineEdit
    Qt setStyleSheet
    python查询
    INSERT INTO .. ON DUPLICATE KEY更新多行记录
    PHP读取流文件
    curl上传、下载、https登陆
  • 原文地址:https://www.cnblogs.com/chaohi/p/2330350.html
Copyright © 2011-2022 走看看