题目:编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。
例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。
解答:
首先,排除三位数的可能(四位数是肯定不可能的无需证明)
假设有三个筐,里面分别有百位数字,十位数字,个位数字。(先不考虑多位数字的前后链接限制)
因为和为100,其实可以看作是个位数字的计算值,加上10*(十位数字的计算值),加上100*(百位数字的计算值)
所以分别考虑:
个位数字和的情况有:0,10,20,30
十位数字和的情况有:10,0,9,8,7
百位数字和的情况有:0,1
分别对应如下:
因为多位数字的前后链接限制,两个百位数字的差肯定大于2,所以百位数字的筐里面不可能存在数字。此处排除3位数的可能。
基本思路:
前1个值的可能计算值:{1}
前2个值的可能计算值:{1+2,1-2,12}
前n个值的可能计算值
S(n) = S(n-2) +\- ( 10*(n-1)+n )
S(n) = S(n-1) +\- n ;
方法:
for(i ➡1 to 9)
if(n ==1 )
列表A: {1};
if ( n ==2 )
列表B: {1+2 , 1-2 , 12 };
else{
“列表n-2 的每个字符串” + "+\-“ + " (n-1)” + “n”,然后放入列表n
“列表n-1 的每个字符串” + "+\-“ + “ n ” ,然后放入列表n
列表n-2 = 列表n-1;
列表n-1 =列表n;
}
然后把列表n-1转换成计算式计算出来,选择值为100的打印所对应的字符串
列表的操作:全部读取,单个插入,复制
package DataStructures;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**
* Created by maoyanting on 2017/8/28.
*/
public class My5 {
LinkedList<String> A = new LinkedList<String>();
LinkedList<String> B = new LinkedList<String>();
LinkedList<String> temp = new LinkedList<String>();
public void sum() {
for (int i = 1; i < 10; i++) {
if (i == 1)
A.addFirst("1");
else if (i == 2) {
B.add("1+2");
B.add("1-2");
B.add("12");
} else {
for (String a : A) {
temp.add(a + "+" + (i - 1) + i);
temp.add(a + "-" + (i - 1) + i);
}
for (String b : B) {
temp.add(b + "+" + i);
temp.add(b + "-" + i);
}
A = B;
B = temp;
temp = new LinkedList<String>();
}
}
}
static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
public static void main(String[] args) {
My5 simple = new My5();
simple.sum();
try {
for (String c : simple.B) {
if (jse.eval(c).equals(100))
System.out.println(c + " = 100");
}
} catch (Exception e) {
System.out.println("Wrong");
}
}
}
输出:
12+3+4+5-6-7+89 = 100
12-3-4+5-6+7+89 = 100
1+23-4+5+6+78-9 = 100
1+2+3-4+5+6+78+9 = 100
1+2+34-5+67-8+9 = 100
12+3-4+5+67+8+9 = 100
1+23-4+56+7+8+9 = 100
感想:
这是一个在公众号上看见的题目,说是好的程序员应该在30m内解出这5道题目,前4题还好,但这最后一题,身为小白的我实在能力有限,最终写出来的方法也应该有挺大问题的,从空间和时间上都很大。