用java求解一道趣味体:123456789插入+,-,*,/后,最后结果为100

来源:互联网 发布:mysql in 优化 编辑:程序博客网 时间:2024/05/21 18:42

 最近在CSDN,看到了一道趣味题:123456789这九个按顺序排列的数,要求在它们之间插入若干个+,-,*,/ ,使其结果正好等于

100如:1*2*3*4+5+6+7*8+9=100。
看了题目后,思考如果用java如何实现。以下是我的解题思路:
思想比较简单,先将插入+,-,*,/后的所有字符串都穷举出来,然后计算哪些字符串等于100。
这里要解决两个问题,一个是怎样将所有的字符串都穷举出来,另一个是怎样将字符串的值计算出来。
第一个问题思路:插入+,-,*,/,其实应该是插入"+", "-", "*", "/", ""。插入""表示相邻数字组成一个数。用递归实现加入每个符号,直到加入最后一个数字。
第二个问题思路:使用栈先将一般的中缀表达式如1*2*3*4+5+6+7*8+9转成后缀表达式1 2 *3 *4 *5 +6 +7 8 *+9 +,
然后再用栈将后缀表达式的值求出,具体思路可以去看下栈在计算表达式值的应用。

以下是具体的代码:

import java.util.Stack;
import java.util.Vector;

public class Hundred {
   
 /**
  * 将中缀表达式转为后缀表达式
  * @param expstr
  * @return
  */
 public static String toPostfix(String expstr) {
  Stack<String> stack = new Stack<String>();
  String postfix = "";
  int i = 0;
  
  while (i < expstr.length()) {
   char ch = expstr.charAt(i);
   switch (ch) {
    case '+':
    case '-': while (!stack.isEmpty()) {
       postfix += stack.pop();
        }
        stack.push(ch +"");
        i++;
        break;
    case '*':
    case '/': while (!stack.isEmpty() && (stack.peek().equals("*")
          || stack.peek().equals("/"))) {
        postfix += stack.pop(); 
        }
        stack.push(ch + "");
        i++;
        break;
    default: while (ch >= '0' && ch <= '9') {
       postfix += ch;
       i++;
       if(i < expstr.length()) {
        ch = expstr.charAt(i);
       }
       else {
        ch = '=';
       }
       }
       postfix += " ";
   }
  }
  while (!stack.isEmpty()) {
   postfix += stack.pop();
  }
  return postfix;
 }
 
 /**
  * 计算后缀表达式的值
  * @param postfix
  * @return
  */
 public static float valueFloat(String postfix) {
  Stack<Float> stack = new Stack<Float>();
  int i = 0;
  float result = 0;
  while (i < postfix.length()) {
   char ch = postfix.charAt(i);
   if (ch >= '0' && ch <= '9') {
    result = 0;
    while (ch != ' ') {
     result = result * 10 + Integer.parseInt(ch + "");
     i++;
     ch = postfix.charAt(i);
    }
    i++;
    stack.push(new Float(result));
   }
   else {
    float y = stack.pop().floatValue();
    float x = stack.pop().floatValue();
    switch (ch) {
     case '+': result = x + y;
       break;
     case '-': result = x - y;
             break;
     case '*': result = x * y;
        break;
     case '/': result = x / y;
       break;
    }
    stack.push(new Float(result));
    i++;
   }
  }
  
  return stack.pop().floatValue();
 }
 
 static String[] symbol = {"+", "-", "*", "/", ""};
 static String[] num1 = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
 static String[] num2 = {"9", "8", "7", "6", "5", "4", "3", "2", "1"};
 static Vector<String> strVector;          // 存储所有表达式
 
 /**
  * 穷举出所有的表达式
  * @param prevStr
  * @param length
  */
 public static void hundred(String prevStr, int length) {
  // 加入下一个数字
  if (length <= num1.length) {                 
   prevStr += num1[length - 1];
  }
  for (int i = 0; i < symbol.length; i++) {
   // 如果还没到第九个数字,加入下一个符号,继续递归
   if (length < num1.length) {
    String nextStr = prevStr + symbol[i];
    hundred(nextStr, length + 1);
   }
   // 如果已经到第九个数字,加入到strVector中
   else {
    strVector.addElement(prevStr);
    break;
   }
  }
 }
 
 public static void main(String[] args) {
  if (strVector == null) {
   strVector = new Vector<String>();
  }
  else {
   strVector.removeAllElements();
  }
  
  String prevStr = "";
  hundred(prevStr, 1);

  int count = 0;
  for (int i  = 0; i < strVector.size(); i++) {
   if (valueFloat(toPostfix((String) strVector.elementAt(i))) == 100) {
    // 输出符合条件的表达式
    System.out.println("解" + (count + 1) + ": " + strVector.elementAt(i));
    count++;
   }
  }
  // 输出符合条件的表达式的个数
  System.out.println(count);
 }
}

将hundred(String prevStr, int length)方法中的num1换成num2,可以得到987654321的结果。

解1: 1+2+3+4+5+6+7+8*9
解2: 1+2+3-4+5+6+78+9
解3: 1+2+3-4*5+6*7+8*9
解4: 1+2+3-45+67+8*9
解5: 1+2+3*4-5-6+7+89
解6: 1+2+3*4*5/6+78+9
解7: 1+2+3*4*56/7-8+9
解8: 1+2+34-5+67-8+9
解9: 1+2+34*5+6-7-8*9
解10: 1+2-3*4+5*6+7+8*9
解11: 1+2-3*4-5+6*7+8*9
解12: 1+2*3+4+5+67+8+9
解13: 1+2*3+4*5-6+7+8*9
解14: 1+2*3-4+56/7+89
解15: 1+2*3-4-5+6+7+89
解16: 1+2*3*4*5/6+7+8*9
解17: 1+2*34-56+78+9
解18: 1+23-4+5+6+78-9
解19: 1+23-4+56+7+8+9
解20: 1+23-4+56/7+8*9
解21: 1+23-4-5+6+7+8*9
解22: 1+23*4+5-6+7-8+9
解23: 1+23*4+56/7+8-9
解24: 1+23*4-5+6+7+8-9
解25: 1+234-56-7-8*9
解26: 1+234*5*6/78+9
解27: 1+234*5/6-7-89
解28: 1-2+3+45+6+7*8-9
解29: 1-2+3*4+5+67+8+9
解30: 1-2+3*4*5+6*7+8-9
解31: 1-2+3*4*5-6+7*8-9
解32: 1-2-3+4*5+67+8+9
解33: 1-2-3+4*56/7+8*9
解34: 1-2-3+45+6*7+8+9
解35: 1-2-3+45-6+7*8+9
解36: 1-2-3+45-6-7+8*9
解37: 1-2-34+56+7+8*9
解38: 1-2*3+4*5+6+7+8*9
解39: 1-2*3-4+5*6+7+8*9
解40: 1-2*3-4-5+6*7+8*9
解41: 1-23+4*5+6+7+89
解42: 1-23-4+5*6+7+89
解43: 1-23-4-5+6*7+89
解44: 1*2+3+4*5+6+78-9
解45: 1*2+3+45+67-8-9
解46: 1*2+3-4+5*6+78-9
解47: 1*2+3*4+5-6+78+9
解48: 1*2+34+5+6*7+8+9
解49: 1*2+34+5-6+7*8+9
解50: 1*2+34+5-6-7+8*9
解51: 1*2+34+56+7-8+9
解52: 1*2+34-56/7+8*9
解53: 1*2-3+4+56/7+89
解54: 1*2-3+4-5+6+7+89
解55: 1*2-3+4*5-6+78+9
解56: 1*2*3+4+5+6+7+8*9
解57: 1*2*3-4+5+6+78+9
解58: 1*2*3-4*5+6*7+8*9
解59: 1*2*3-45+67+8*9
解60: 1*2*3*4+5+6+7*8+9
解61: 1*2*3*4+5+6-7+8*9
解62: 1*2*3*4-5-6+78+9
解63: 1*2*34+56-7-8-9
解64: 1*2/3+4*5/6+7+89
解65: 1*23+4+5+67-8+9
解66: 1*23+4+56/7*8+9
解67: 1*23-4+5-6-7+89
解68: 1*23-4-56/7+89
解69: 1*23*4-56/7/8+9
解70: 1*234+5-67-8*9
解71: 1/2*3/4*56+7+8*9
解72: 1/2*34-5+6-7+89
解73: 1/2/3*456+7+8+9
解74: 12+3+4+5-6-7+89
解75: 12+3+4-56/7+89
解76: 12+3-4+5+67+8+9
解77: 12+3*4+5+6+7*8+9
解78: 12+3*4+5+6-7+8*9
解79: 12+3*4-5-6+78+9
解80: 12+3*45+6*7-89
解81: 12+34+5*6+7+8+9
解82: 12+34-5+6*7+8+9
解83: 12+34-5-6+7*8+9
解84: 12+34-5-6-7+8*9
解85: 12-3+4*5+6+7*8+9
解86: 12-3+4*5+6-7+8*9
解87: 12-3-4+5-6+7+89
解88: 12-3-4+5*6+7*8+9
解89: 12-3-4+5*6-7+8*9
解90: 12*3-4+5-6+78-9
解91: 12*3-4-5-6+7+8*9
解92: 12*3-4*5+67+8+9
解93: 12/3+4*5-6-7+89
解94: 12/3+4*5*6-7-8-9
解95: 12/3+4*5*6*7/8-9
解96: 12/3/4+5*6+78-9
解97: 123+4-5+67-89
解98: 123+4*5-6*7+8-9
解99: 123+45-67+8-9
解100: 123-4-5-6-7+8-9
解101: 123-45-67+89
101个

解1: 9+8+7+6*5+43+2+1
解2: 9+8+7+65+4+3*2+1
解3: 9+8+7+65+4*3-2+1
解4: 9+8+7-6+54*3/2+1
解5: 9+8+7-6-5+43*2+1
解6: 9+8+7*6+5+4+32*1
解7: 9+8+7*6+5+4+32/1
解8: 9+8+7*6+5/4*32+1
解9: 9+8+7*6-5+43+2+1
解10: 9+8+7*6*5-4*32+1
解11: 9+8+76+5+4-3+2-1
解12: 9+8+76+5-4+3+2+1
解13: 9+8+76+5-4+3*2*1
解14: 9+8+76+5-4+3*2/1
解15: 9+8-7+65+4*3*2+1
解16: 9+8-76+54*3-2-1
解17: 9+8*7+6+5+4*3*2*1
解18: 9+8*7+6+5+4*3*2/1
解19: 9+8*7+6+5*4*3/2-1
解20: 9+8*7+6*5+4+3-2*1
解21: 9+8*7+6*5+4+3-2/1
解22: 9+8*7+6*5+4*3/2-1
解23: 9+8*7-6+5+4+32*1
解24: 9+8*7-6+5+4+32/1
解25: 9+8*7-6+5/4*32+1
解26: 9+8*7-6-5+43+2+1
解27: 9+87+6+5-4*3/2-1
解28: 9+87+6-5+4-3+2*1
解29: 9+87+6-5+4-3+2/1
解30: 9+87+6-5-4+3*2+1
解31: 9+87+6-5*4-3+21
解32: 9+87+6*5/4/3*2-1
解33: 9+87-6+5+4+3-2*1
解34: 9+87-6+5+4+3-2/1
解35: 9+87-6+5+4*3/2-1
解36: 9+87-6+54/3/2+1
解37: 9+87-6-5+4*3+2+1
解38: 9+87*6-5*43*2-1
解39: 9-8+7+6+54+32*1
解40: 9-8+7+6+54+32/1
解41: 9-8+7+65-4+32-1
解42: 9-8+7*6+5*4*3-2-1
解43: 9-8+76+54-32+1
解44: 9-8+76-5+4+3+21
解45: 9-8+76-5+4/3*21
解46: 9-8+76-5-4+32*1
解47: 9-8+76-5-4+32/1
解48: 9-8+76*5/4+3+2-1
解49: 9-8-7+6*54/3-2*1
解50: 9-8-7+6*54/3-2/1
解51: 9-8-7+65+43-2*1
解52: 9-8-7+65+43-2/1
解53: 9-8-7*6+54*3-21
解54: 9-8*7+6+54*3-21
解55: 9-8*7*6-5+432*1
解56: 9-8*7*6-5+432/1
解57: 9*8+7+6+5+4+3+2+1
解58: 9*8+7+6+5+4+3*2*1
解59: 9*8+7+6+5+4+3*2/1
解60: 9*8+7+6+5+4*3-2*1
解61: 9*8+7+6+5+4*3-2/1
解62: 9*8+7+6+5*4-3-2*1
解63: 9*8+7+6+5*4-3-2/1
解64: 9*8+7+6+5*4-3*2+1
解65: 9*8+7+6+54/3-2-1
解66: 9*8+7+6-5-4+3+21
解67: 9*8+7+6*5+4*3-21
解68: 9*8+7+6*5-4-3-2*1
解69: 9*8+7+6*5-4-3-2/1
解70: 9*8+7+6*5-4-3*2+1
解71: 9*8+7+6*5-4*3+2+1
解72: 9*8+7+6*5*4/3/2+1
解73: 9*8+7+65-43-2+1
解74: 9*8+7-6+5+4-3+21
解75: 9*8+7-6+5+43-21
解76: 9*8+7-6+5*4+3*2+1
解77: 9*8+7-65+43*2*1
解78: 9*8+7-65+43*2/1
解79: 9*8+7*6-5+4*3-21
解80: 9*8+7*6-5-4-3-2*1
解81: 9*8+7*6-5-4-3-2/1
解82: 9*8+7*6-5-4-3*2+1
解83: 9*8+7*6-5-4*3+2+1
解84: 9*8+7*6-5*4+3+2+1
解85: 9*8+7*6-5*4+3*2*1
解86: 9*8+7*6-5*4+3*2/1
解87: 9*8+76-54+3+2+1
解88: 9*8+76-54+3*2*1
解89: 9*8+76-54+3*2/1
解90: 9*8-7+6+5+4*3*2*1
解91: 9*8-7+6+5+4*3*2/1
解92: 9*8-7+6+5*4*3/2-1
解93: 9*8-7+6*5+4+3-2*1
解94: 9*8-7+6*5+4+3-2/1
解95: 9*8-7+6*5+4*3/2-1
解96: 9*8-7-6+5+4+32*1
解97: 9*8-7-6+5+4+32/1
解98: 9*8-7-6+5/4*32+1
解99: 9*8-7-6-5+43+2+1
解100: 9*8*7/6+5+4+3*2+1
解101: 9*8*7/6+5+4*3-2+1
解102: 9*8*7/6+5*4-3-2+1
解103: 9*8*7/6+54/3-2*1
解104: 9*8*7/6+54/3-2/1
解105: 9*8*7/6*5/4-3-2*1
解106: 9*8*7/6*5/4-3-2/1
解107: 9*8*7/6*5/4-3*2+1
解108: 98+7+6+5*4-32+1
解109: 98+7+6-5-4-3+2-1
解110: 98+7+6-5-4*3/2*1
解111: 98+7+6-5-4*3/2/1
解112: 98+7+6*5-4-32+1
解113: 98+7-6+5-4+3-2-1
解114: 98+7-6+5-4-3+2+1
解115: 98+7-6-5+4+3-2+1
解116: 98+7-6-5+4*3/2*1
解117: 98+7-6-5+4*3/2/1
解118: 98+7-6*5+4*3*2+1
解119: 98+7-6*5/4+3/2+1
解120: 98+7-6*5/4/3*2*1
解121: 98+7-6*5/4/3*2/1
解122: 98+7*6+5-43-2*1
解123: 98+7*6+5-43-2/1
解124: 98+7*6-5-4-32+1
解125: 98+7*6-5/4*32*1
解126: 98+7*6-5/4*32/1
解127: 98+7/6+5/4/3*2*1
解128: 98+7/6+5/4/3*2/1
解129: 98-7+6+5+4-3-2-1
解130: 98-7+6+5+4-3*2*1
解131: 98-7+6+5+4-3*2/1
解132: 98-7+6+5-4+3-2+1
解133: 98-7+6-5+4+3+2-1
解134: 98-7+6-54/3+21
解135: 98-7+6*5/4+3/2*1
解136: 98-7+6*5/4+3/2/1
解137: 98-7-6+5+4+3+2+1
解138: 98-7-6+5+4+3*2*1
解139: 98-7-6+5+4+3*2/1
解140: 98-7-6+5+4*3-2*1
解141: 98-7-6+5+4*3-2/1
解142: 98-7-6+5*4-3-2*1
解143: 98-7-6+5*4-3-2/1
解144: 98-7-6+5*4-3*2+1
解145: 98-7-6+54/3-2-1
解146: 98-7-6-5-4+3+21
解147: 98-7*6+5*4+3+21
解148: 98-76+54+3+21
解149: 98*7/6+5*4/3-21
解150: 98*7/6-5*4/3*2-1
解151: 98/7+6+54*3/2-1
解152: 98/7+6-5+43*2-1
解153: 98/7-6+5+43*2+1
解154: 98/7*6+5+4+3*2+1
解155: 98/7*6+5+4*3-2+1
解156: 98/7*6+5*4-3-2+1
解157: 98/7*6+54/3-2*1
解158: 98/7*6+54/3-2/1
解159: 98/7*6*5/4-3-2*1
解160: 98/7*6*5/4-3-2/1
解161: 98/7*6*5/4-3*2+1
161个

 

 

 

原创粉丝点击