1,2,3,4,5,6,7,8,9添加‘+’,‘-’使得結果等于100?

今天在聊天群里看到這個圖,貌似是幾個面試題。然后自己動手試了試,結果在第5題卡住了。


image

想了好久好久,總覺得拿加減號去湊的話情況太多了,數字怎么分割呢?
想到數字的組合超過3個除了123其他都不行的
后來去搜了一下,搜到一個python版本,卻怎么看都看不懂
再后來又搜到一個java版本,里面提到說,將空白‘’看成一個運算符
臥槽,瞬間醍醐灌頂。這就變成了將‘+’,‘-’,‘*’,‘/’,‘’ 5個操作符隨機插入1-9的8個空位中。
然后遍歷一下所有可能,計算出符合結果的表達式。bingo!
于是我開始寫代碼,for.. ? 臥槽這怎么個遍歷法啊?然后又回去看那個python代碼
循環每個操作符 -> 接著進入下一層節點 -> 一直到最后一個節點(17) -> 然后返回上一層節點繼續循環下一個操作符 -> 完全遍歷所有節點
這好像是以前學過的深度優先遍歷來著?好吧。。
先寫了一個PHP版本:

<?php
echo '<html><head><title>Hello XiaXue.</title></head><body>';
function echoNoQuestion($idx, $content) {
    echo '<h2>第'.$idx.'題</h2>';
    echo '<div>'.$content.'</div>';
    echo '<hr />';
}
function randomArr($length, $min=1, $max=100) {
    $ret = [];
    for ($i = 0; $i<$length; $i++) {
        $ret[] = rand($min, $max);
    }
    return $ret;
}

// Q1.
$q1_arr = randomArr(10);
function Q1_a($arr) {
    $len = count($arr);
    $i = 0;
    $sum = 0;
    while ($i < $len) {
        $sum += $arr[$i];
        $i++;
    }
    return $sum;
}
function Q1_b($arr) {
    $len = count($arr);
    $sum = 0;
    for ($i=0; $i<$len; $i++) {
        $sum += $arr[$i];
    }
    return $sum;
}
function Q1_c($arr) {
    $len = count($arr);
    if ($len > 1) {
        $item = array_pop($arr);
        return $item + Q1_c($arr);
    } else {
        return $arr[0];
    }
}
echoNoQuestion(1, 'a:'. Q1_a($q1_arr) . '<br />b:'. Q1_b($q1_arr) .'<br />c:'. Q1_c($q1_arr) );

// Q2.
$q2_arr1 = randomArr(10, 1, 20);
$q2_arr2 = randomArr(10, 100, 200);
function Q2($arr1, $arr2) {
    $ret = [];
    foreach ($arr1 as $k=>$v) {
        $ret[] = $v;
        if (isset($arr2[$k])) {
            $ret[] = $arr2[$k];
        }
    }
    return $ret;
}
echoNoQuestion(2, 'arr1:'. join(',', $q2_arr1) . '<br />arr2:'. join(',', $q2_arr2) .'<br />c:'. join(',', Q2($q2_arr1, $q2_arr2)) );

// Q3.
function Fibonacci($n=100) {
    if ($n == 1) {
        return [0];
    } elseif ($n == 2) {
        return [0, 1];
    } else {
        $fib = Fibonacci($n-1);
        $len = count($fib);
        return array_merge($fib, array($fib[$len-1]+$fib[$len-2]));
    }
}
echoNoQuestion(3, 'Fibonacci:'. join(', ', Fibonacci(20)) );

// Q4.
$q4_arr = randomArr(5);
function mergeMaxNumber($arr) {
    rsort($arr, SORT_STRING );
    return join('-', $arr);
}
echoNoQuestion(4, 'Max number:'. mergeMaxNumber($q4_arr) );

// Q5.
$list = range(1, 9);
$idx = 1;
function add100($arr, $next=0) {
    global $list, $idx;
    $len = count($arr);
    if ($len == 17) {
        $str = join('', $arr);
        if (eval('return '. $str . ';') == 100 ) {

            echo $idx.'. '.$str.' = 100<br />';
            $idx++;
        }
    } else {
        $exp = ['+','','-'];//,'*','/'];
        foreach ($exp as $c) {
            $arr[] = $c;
            $next++;
            $arr[] = $list[$next];
            //$arr[] = $arr[$len-1]+1;
            add100($arr, $next);
            $next--;
            array_pop($arr);
            array_pop($arr);
        }
    }
}
echoNoQuestion(5, 'Resut:');
echo date('H:i:s', time()).'<br />';
add100([1]);
echo date('H:i:s', time()).'<br />';
echo '</body></html>';
?>

結果:


image

然后試著寫了一邊python版本:

import random

print('#'*50)
print('#'+'Hello XiaXue'.center(48)+'#')
print('#'*50, '\n')

def printRes(res, idx):
    print('第'+idx+'題:')
    print(res)
    print('========================\n')

# Q1
def sum_while(list_tmp):
    l = len(list_tmp)
    i = 0
    s = 0
    while (i < l):
        s += int(list_tmp[i])
        i += 1
    return str(s)

def sum_for(list_tmp):
    s = 0
    for item in list_tmp:
        s += int(item)
    return str(s)

def sum_recursive(list_tmp):
    l = len(list_tmp)
    if l>1:
        item = int(list_tmp.pop(-1))
        return sum_recursive(list_tmp) + item
    else:
        return int(list_tmp[0])

printRes('While:'+sum_while(list('123456789'))+'\n'+'For:'+sum_for(list('123456789'))+'\n'+
         'Recursive:'+str(sum_recursive(list('123456789'))), '1')

# Q2
list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10,11,12,13]
def mergeList(l1, l2):
    n1 = len(l1)
    n2 = len(l2)
    n = min([n1, n2])
    nl = []
    i = 0
    while i<n:
        nl.append(l1[i])
        nl.append(l2[i])
        i+=1

    # bug
    #nl.append(l1[(n-1):])
    #nl.append(l2[(n-1):])
    #[1, 6, 2, 7, 3, 8, 4, 9, 5, 10, [5], [10, 11, 12, 13]]

    #fixed
    nl.extend(l1[i:])
    nl.extend(l2[i:])
    return nl

printRes(mergeList(list1, list2), '2')

# Q3
def Fibonacci(n):
    if n==1:
        return [0]
    if n==2:
        return [0,1]
    if n>2:
        fib = Fibonacci(n-1)
        fib.append(fib[-2]+fib[-1])
        return fib

printRes(Fibonacci(100), '3')

# Q4
def rand_list(n):
    x = []
    i = 0
    while i<n:
        x.append(random.randint(1, 99))
        i += 1
    return x
list_a = rand_list(6)
def merge_number(li):
    tmp = []
    for n in li:
        tmp.append(str(n))
    tmp.sort()
    tmp.reverse()
    return '-'.join(tmp)
printRes(merge_number(list_a), '4')

# Q5
i = 1
def sum_for_100(pattern):
    global i
    if len(pattern) == 17:
        try:
            e = ''.join(pattern)
            if eval(e) == 100:
                print(i, e)
                i=i+1
        except Exception as e:
            pass
    else:
        x = int(pattern[-1])
        for czf in ['+','-','']:
            pattern.append(czf)
            pattern.append(str(x + 1))
            sum_for_100(pattern)
            pattern.pop(-1)
            pattern.pop(-1)
printRes('', '5')
sum_for_100(['1'])

結果:


image

這里在那個python版本的基礎上做了點改進,少了幾行代碼。。
大部分函數靠百度。。寫得很吃力
很多函數方法用法習慣相差很大,代碼縮進語法之類還是小問題

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,476評論 25 708
  • 學生時代談戀愛可能是最無力的吧,明知道她需要自己自己卻隔著屏幕無能為力。
    夢想_More閱讀 345評論 0 0
  • 在婚姻生活中,如果愛人背叛了你,青年時期你可能會大哭大鬧,甚至不給對方任何余地,一怒之下離婚了斷。 如果你是中年了...
    胡楊公主閱讀 284評論 4 11
  • 當錢芊帶著哭腔與顫抖的聲音在多次都撥不通肖音的電話之后她只好給肖音的微信留言,但原因剛寫到一半,手機自動關機。急匆...
    萬粒閱讀 213評論 0 0