PHP经典算法(五)
2019-12-18 09:20:43 来源:admin 点击:702
【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
2 就是第三个数是前两个数字的和,既是经典的菲波那切数列
function actionFblist($n)
{
// 1,1,2,3,5,8,13
// $n 为第n个月
$arr = [1,1];
if($n < 2)
return false;
for ($i=2;$i<=$n+1;$i++)
{
$arr[$i] = $arr[$i-1] + $arr[$i-2];
}
var_dump($arr);
echo $arr[$n+1];
}
【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数。
public function actionIsPrimeNumber()
{
$arr = [];
for ($i=101;$i<=200;$i++)
{
$flag = true;
for ($j = 2;$j<=sqrt($i);$j++)
{
if($i % $j == 0)
{
$flag = false;
}
}
if($flag == true)
$arr[] = $i;
}
var_dump($arr);
}
【程序3】 题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
public function actionWaterFlower()
{
$re = [];
for($i = 100;$i<= 999;$i++)
{
$hundred = floor($i / 100 ); // 获取百位数字
$ten = floor(($i %100 ) / 10 ); // 获取十位数字
$one = floor($i % 100 % 10); // 获取各位数字
if((pow($hundred,3) + pow($ten,3) + pow($one,3) ) == $i )
{
$re[] = $i;
}
}
var_dump($re);
}
【程序4】 题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
1.程序分析:(a> b)?a:b这是条件运算符的基本例子。
public function actionGetScore()
{
$score = 90;
if($score <0 || $score > 100)
return false;
$re = $score >= 90 ? 'A' : ($score >= 60 ? 'B' :'C');
var_dump($re);
}
【程序5】 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
1.程序分析:关键是循环获得计算出每一项的值。
2. 可以使用php的str_repeat函数
public function actionRepeatN()
{
$a = 8;
$n = 8;
$sum = 0;
for ($i = 0;$i<$n;$i++)
{
$num = 0;
for ($j = 0;$j<=$i;$j++)
{
$num += $a* pow(10,$j);
}
$sum += $num;
}
var_dump($sum);
}