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
*/