2010-03-04 95 views
9

有上codinghorror.com保羅Jungwirth,其中包括一個小的編程任務博客中評論:錯誤地問我還是我愚蠢?

你有號碼123456789,按照這個順序。在每個數字之間,您必須插入無,加號或乘號,以便得到的表達式等於2001.編寫一個打印所有解決方案的程序。 (有兩個。)

無聊,我想,我會去的,但如果我能得到2001年的結果,我會被詛咒。我認爲下面的代碼是健全的,我認爲根據我的代碼,2002年有兩種解決方案。我是對的還是我錯了?

/** 
* Take the numbers 123456789 and form expressions by inserting one of '' 
* (empty string), '+' or '*' between each number. 
* Find (2) solutions such that the expression evaluates to the number 2001 
*/ 

$input = array(1,2,3,4,5,6,7,8,9); 

// an array of strings representing 8 digit, base 3 numbers 
$ops = array(); 
$numOps = sizeof($input)-1; // always 8 
$mask = str_repeat('0', $numOps); // mask of 8 zeros for padding 

// generate the ops array 
$limit = pow(3, $numOps) -1; 
for ($i = 0; $i <= $limit; $i++) { 
    $s = (string) $i; 
    $s = base_convert($s, 10, 3); 
    $ops[] = substr($mask, 0, $numOps - strlen($s)) . $s; 
} 

// for each element in the ops array, generate an expression by inserting 
// '', '*' or '+' between the numbers in $input. e.g. element 11111111 will 
// result in 1+2+3+4+5+6+7+8+9 
$limit = sizeof($ops); 
$stringResult = null; 
$numericResult = null; 
for ($i = 0; $i < $limit; $i++) { 
    $l = $numOps; 
    $stringResult = ''; 
    $numericResult = 0; 
    for ($j = 0; $j <= $l; $j++) { 
     $stringResult .= (string) $input[$j]; 
     switch (substr($ops[$i], $j, 1)) { 
      case '0': 
       break; 
      case '1': 
       $stringResult .= '+'; 
       break; 
      case '2': 
       $stringResult .= '*'; 
       break; 
      default : 
     } 
    } 

    // evaluate the expression 

    // split the expression into smaller ones to be added together 
    $temp = explode('+', $stringResult); 
    $additionElems = array(); 
    foreach ($temp as $subExpressions) 
    { 
     // split each of those into ones to be multiplied together 
     $multplicationElems = explode('*', $subExpressions); 
     $working = 1; 
     foreach ($multplicationElems as $operand) { 
      $working *= $operand; 
     } 
     $additionElems[] = $working; 
    } 
    $numericResult = 0; 
    foreach($additionElems as $operand) 
    { 
     $numericResult += $operand; 
    } 

    if ($numericResult == 2001) { 
     echo "{$stringResult}\n"; 
    } 
} 

回答

12

再往下您鏈接到....在同一頁=)

「保羅Jungwirth寫道:

你有號123456789,在 的順序每個數字之間。 ,你 必須插入任何東西,加號 符號或乘號,所以 ,得到的表達式等於 2001.編寫一個打印所有解決方案的程序(有兩個。)

我想你的意思是2002年,2001年沒有:)

(只是修正爲別人像 我誰癡迷試圖解決這樣一個 小 「實踐」的問題,然後打穀歌時,他們的 結果與指定的 答案不符。 ;)該死,其中的一些的Perl 實例是難看)」

+3

而且Jungwirth證實了他的意思是2002年提出一些看法下來從 – 2010-03-04 23:22:40

+0

這真棒 – 2010-03-04 23:24:56

+2

球很好,至少我得到了一些代碼審查的做法! – jah 2010-03-04 23:26:08

3

數量是2002年

遞歸溶液需要11行的JavaScript(不包括字符串表達式求值,這是一個標準的JavaScript功能,但是它可能需要再過十年左右行的代碼推出自己的這種特定情況下):!

function combine (digit,exp) {      
    if (digit > 9) {        
     if (eval(exp) == 2002) alert(exp+'=2002'); 
     return;         
    }            
    combine(digit+1,exp+'+'+digit);    
    combine(digit+1,exp+'*'+digit);    
    combine(digit+1,exp+digit);     
    return;          
}             
combine(2,'1');