一个小的计算题


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值