Chinaunix首页 | 论坛 | 博客
  • 博客访问: 601074
  • 博文数量: 129
  • 博客积分: 8026
  • 博客等级: 中将
  • 技术积分: 1300
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-21 14:39
文章分类

全部博文(129)

文章存档

2011年(1)

2007年(26)

2006年(102)

我的朋友

分类:

2006-06-30 15:35:02

任意一个正整数,都可以分解成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(2floor(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 $vfunc1($v
);
}
//2
function testFunc2($nums
){
    foreach(
$nums as $vfunc2($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

原来的方法稍胜一点...

阅读(4076) | 评论(9) | 转发(0) |
给主人留下些什么吧!~~