编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是 100 的程序,并输出所有的可能性
前几天在博客园的外文翻译里看到一篇《每个程序员1小时内必须解决的5个编程问题》,前4题还不是很难,但是第五题就有点看似简单,写起来却很蛋疼。
(虽然头部和其他博文有点相似但是解决办法不太一样,而且好理解)
题目是这样的:
编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是 100 的程序,并输出所有的可能性。
例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。
你能在多长时间写完呢?
下面是我的解法(Java):
@Test
public void test05() throws ScriptException{
String stringArray [] = new String[]{"+","-",""};
List<String> resultList=new ArrayList<String>();
for(int a=0;a<stringArray.length;a++){
for(int b=0;b<stringArray.length;b++){
for(int c=0;c<stringArray.length;c++){
for(int d=0;d<stringArray.length;d++){
for(int e=0;e<stringArray.length;e++){
for(int f=0;f<stringArray.length;f++){
for(int g=0;g<stringArray.length;g++){
for(int h=0;h<stringArray.length;h++){
String result=1+stringArray[a]+2+stringArray[b]+
3+stringArray[c]+4+stringArray[d]+5+stringArray[e]+
6+stringArray[f]+7+stringArray[g]+8+stringArray[h]+9;
if(getSum(result)==100){
resultList.add(result);
}
}
}
}
}
}
}
}
}
for(int i=0;i<resultList.size();i++){
System.out.println(resultList.get(i)+"=="+getSum(resultList.get(i)));
}
}
public int getSum(String str) throws ScriptException{
ScriptEngine se = new ScriptEngineManager().getEngineByName("JavaScript");
double d = (double) se.eval(str);
//System.out.println(d);
return (int)d;
}
基本思路就是:暴力**,先生成表达式字符串,然后对表达式字符串进行计算。