【问题标题】:representation of any number in power of '2' using PHP使用 PHP 以 '2' 的幂表示任意数字
【发布时间】:2011-10-27 03:26:54
【问题描述】:

我尝试玩php,但是我卡在一个地方,我测试了$n = 1024的值,然后需要60多秒,所以出现php超时错误,我不知道如何克服这个问题,如果我唯一的要求是在 20 + ---+ 2n 表单中显示任何输入数字。
用 n=121 尝试下面的代码,我得到了这个,但我希望在 2n 中也代表 57 表单,所以我尝试了递归,但没有奏效。

看看如何给定编号。以“2”的幂表示:
20 + 21 + 22 + 2 + 24+ 25 + 26+ 57

代码:

<?php

echo("see how a given no. be represented in powers of '2' :<br/>\n");

$n=121;
$two_pow=array(
    pow(2,0),pow(2,1),pow(2,2),pow(2,3),pow(2,4),pow(2,5),
    pow(2,6),pow(2,7),pow(2,8),pow(2,9),pow(2,10)
);
//print_r($two_pow);


$i=0;

while($n>=$two_pow[$i])
    $i++;

/* displaying  2^3*/
if($i>0)
    $ij=$i-1;

/* diplaying difference of give N and 2^i*/
$diff=$n-$two_pow[$ij];

if($n>0)
{
    for($i=0;$i<=$ij;$i++)
    {
        echo("2<sup> $i </sup>"."+ \n");

        if($i==$ij && $diff>0)
        {
            echo("\n". $diff);
        }
    }
}
else 
    echo("<br/>not possible for values less then zero");

?>

【问题讨论】:

  • 嗯,是的,这需要时间来计算!你还期待什么?为什么递归“不起作用”?这里有什么问题?
  • 你需要建议程序修改,它允许表示任何数字,无论是1还是大于1024。最后,当剩下任何差异时,也希望以 2^n 形式表示,我不知道要实现的正确递归,所以我在这里问像你们这样的专家。
  • 投反对票有时会给人一种辱骂的感觉,所以如果你不能回答正确的代码来完成任务,请避免这种情况。
  • 废话。如果它值得被否决,我会否决一个答案。我的知识与它无关。你的逆向心理对我不起作用。

标签: php recursion timeout design-patterns


【解决方案1】:

您不能使用 -base_convert() 将字符串转换为二进制,然后根据位的位置格式化输出吗?

【讨论】:

    【解决方案2】:

    不需要递归或类似的东西,只需转换为二进制并循环字符即可:

    $bits = array_reverse(str_split(decbin($n)));
    $output = array();
    foreach($bits as $key => $bit) {
        if($bit == 1) {
            $output[] = '2<sup>'.($key).'</sup>';
        }
    }
    echo implode(' + ', $output);
    

    工作示例:

    http://codepad.org/plzvw2RL

    【讨论】:

    • 你运行过这段代码吗,它有同样的超时问题,当 n=512 时给出 2^10,但是很高兴知道新的方式来解决同样的任务。
    • 它没有任何超时问题,没有什么繁重的计算,所以如果它挂起,原因在别处。 n=512 的预期输出是多少? 2^10 是表示该数字的唯一方法。
    • 当我再次尝试使用 n=1024 时,需要超过 60 秒,所以发生了超时,并且 n=512 被表示为 2^9,而不是 2^10,这是n=1024
    • 我已更新示例以提供正确的结果。从键盘链接可以非常清楚地看到,该脚本的执行时间不会超过 60 秒。删除所有其他代码并重试,在该示例中没有任何计算开销。
    • 我也尝试了一些使用基本转换方法的东西,我在这里列出了:demlaip.wordpress.com/2011/08/16/… 我也尝试了你的解决方案,它的上帝知道另一种方法来做同样的事情..
    【解决方案3】:

    这是个笑话吧? 哦,不是吗? 好吧 看看decbin function。不是更简单吗?

    【讨论】:

    • 如果你认为这是一个笑话,请不要笑,提供代码来完成手头的任务。
    • @Demla Pawan:请不要感到被冒犯 :) 将您的数字从 DEC 转换为 BIN 就容易多了,然后只需输入 2^i if 1 即可解析结果 :)
    • @Demla:在寻求免费帮助时,你应该停止告诉人们该做什么。
    • @mkk : 没有这样的,谢谢,我正在尝试你的建议。
    • @Tomalak : 为了得到你想要的,你必须详细说明你真正想要的,这是我在大学里学到的,所以不要觉得被冒犯,我非常感谢网站和这里的人,包括你,伙计。
    【解决方案4】:

    你可以通过disabling the timeout来克服超时限制:

    set_time_limit(0);
    

    【讨论】:

    • 这真的是解决问题的方法吗?如果这样的事情超时,我认为整个方法是错误的
    • 所以,与其建议更改环境参数,不如建议我正确的代码来完成任务。
    • 在我的日常工作中,我发现人们认为解决需要很长时间的问题的方法是增加超时!虚幻!
    • @diagonalbatman:这不是算法耗时的解决方案。这是不允许算法运行的解决方案。该算法需要时间:您将需要删除超时。如果您可以加快速度,那就太好了!
    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多