文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>[算法题]将一个正整数分解为2的n次方之和

[算法题]将一个正整数分解为2的n次方之和

时间:2006-06-30  来源:一地风飞

任意一个正整数,都可以分解成2的n次方的和(不知道数学上的叫法是什么?

)
如:
func(1) = 20;
func(2) = 21
func(3) = 21+20
func(5) = 22+20
func(7) = 22+21+20
func(8) = 23;
.
.
func(65) = 26+20

php的解法:

function func1($num){
    $res = array();
    while($num>0){
        $re = pow(2, floor(log($num,2)));
        $num -= $re;
        $res[] = $re;
    }
    return $res;
}
?>

在网友rardge的提示下,我想出了第二种方法,不过估计这并不是rardge所说的方法,因为效率比我原来的还差..

二进制位判断法:

function func2($num){
    $bit = decbin($num);
    $pow = array_reverse(str_split($bit));
    foreach($pow as $k=>$v) {
        if($v==1) $re[] = pow(2,$k);
    }
    return $re;
}
两种方法的效率对比:
//benchmark
//1
function testFunc1($nums){
    foreach($nums as $v) func1($v);
}
//2
function testFunc2($nums){
    foreach($nums as $v) func2($v);
}

require_once 'Benchmark/Iterate.php';
$benchmark1 = new Benchmark_Iterate;
$benchmark1->run(1000, 'testFunc1',$nums);
$benchmark2 = new Benchmark_Iterate;
$benchmark2->run(1000, 'testFunc2',$nums);

$result = $benchmark1->get();
echo 'func1:'.$result["mean"]."
";
$result = $benchmark2->get();
echo 'func2:'.$result["mean"]."
";

结果:
func1:0.000229
func2:0.000328
原来的方法稍胜一点...


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载