一个小的计算题

来源:互联网 发布:淘宝上买刀具犯法吗 编辑:程序博客网 时间:2024/05/17 03:10


题目:编写一个在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题还好,但这最后一题,身为小白的我实在能力有限,最终写出来的方法也应该有挺大问题的,从空间和时间上都很大。


原创粉丝点击