龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

《Ruby太慢了》php版回文数计算代码

时间:2014-07-22 14:49来源: 作者: 点击:
分享到:
起因见《Ruby太慢了》(http://www.oschina.net/translate/ruby-is-too-slow-for-programming-competitions) br / 和《 a href=http://www.oschina.net/code/snippet_86510_20734 rel=nofollowJava解决《Ruby太慢了》的问题/a》 br / 实现
起因见《Ruby太慢了》(http://www.oschina.net/translate/ruby-is-too-slow-for-programming-competitions)
和《 Java解决《Ruby太慢了》的问题
实现了个php版的。不过答案似乎和Java版不一样。。。(有些数比如121,其平方根11,在百度知道是算回文数的。。)


运行结果是



121 
484 
10201 
12321 
14641 
40804 
44944 
1002001 
1234321 
4008004 
100020001 
102030201 
104060401 
121242121 
123454321 
125686521 
400080004 
404090404 
10000200001 
10221412201 
12102420121 
12345654321 
40000800004 
1000002000001 
1002003002001 
1004006004001 
1020304030201 
1022325232201 
1024348434201 
1210024200121 
1212225222121 
1214428244121 
1232346432321 
1234567654321 
4000008000004 
4004009004004 
页面运行时间: 26.497004985809 秒
<?php
//给出两个数值X和Y,统计在这个区间里的回文数,并且要求它们的平方根也是回文数。其中 1<= x <= y < 10 14 
error_reporting(E_ALL);
ini_set("display_errors", 1);
//避免超时
set_time_limit(0);
$t1=microtime();
function  isPlalindrome($num){
    $str="$num";
	$len=strlen($num);
	$k = intval($len/2) + 1;//获取中间位数
	for($j=0;$j<$k;$j++){
	   if($str{$j}!=$str{$len-1-$j}){   
			return false;
	   }
	}	
	return true;
}

function showPlalindrome($min,$max){
	//因为要计算在$min,$max间的回文数且其自身平方根也是回文数,所以相当于求一sqrt($min)~sqrt($max)间数,其平方在$min~$max间也是回文数
	//$min~$max是连续正整数,所以可以这样缩小很多计算量,否则……
	$start=sqrt($min);
	$end=sqrt($max);
	for($i=$start;$i<$end;$i++){
		if(isPlalindrome($i) &&isPlalindrome($n=$i*$i) ){
		  echo $n." <br/>";
		}
	}
}

showPlalindrome(1,100000000000000);

$t2=microtime();

$starttime = explode(" ",$t1); 
$endtime = explode(" ",$t2); 
$totaltime = $endtime[0]-$starttime[0]+$endtime[1]-$starttime[1]; 
$timecost = sprintf("%s",$totaltime); 
echo "页面运行时间: $timecost 秒"; 


?>
精彩图集

赞助商链接