php - 问错了还是我傻?

标签 php

Paul Jungwirth 在 codinghorror.com 上发表了一篇博文评论,其中包括一些编程任务:

You have the numbers 123456789, in that order. Between each number, you must insert either nothing, a plus sign, or a multiplication sign, so that the resulting expression equals 2001. Write a program that prints all solutions. (There are two.)

无聊,我想,我会试一试,但如果我能得到 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";
    }
}

最佳答案

在您链接到的同一页面的下方... =)

"Paul Jungwirth wrote:

You have the numbers 123456789, in that order. Between each number, you must insert either nothing, a plus sign, or a multiplication sign, so that the resulting expression equals 2001. Write a program that prints all solutions. (There are two.)

I think you meant 2002, not 2001. :)

(Just correcting for anyone else like me who obsessively tries to solve little "practice" problems like this one, and then hit Google when their result doesn't match the stated answer. ;) Damn, some of those Perl examples are ugly.)"

关于php - 问错了还是我傻?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2383463/

相关文章:

php - 求关联数组中相同键值的平均值

php - 在关联数组中使用 PHP 变量从 SQL 数据库中获取数据

PHPUnit - 在测试中自动加载类

php - 从一张表迁移到另一张表

php - 允许 $wpdb mysql 查询处理特定的 WordPress 类别

php - 在 php 中使用元刷新标签进行重定向而不是 header() 函数是一种好习惯吗?

php - Magento 自定义集合阻止正确的 Massaction 复选框选择

php - 从 Symfony2 中的嵌入式 Controller 重定向

php - 使用 php mysql 值的进度条

php - MySQL 存储过程 PHP JSON 响应