一道面试题
一只兔子 ,在第 5 到 10 天每天生一只,第 10 天后死亡,开始有 1 只兔子,问第 100 天有几只兔子
一只兔子 ,在第 5 到 10 天每天生一只,第 10 天后死亡,开始有 1 只兔子,问第 100 天有几只兔子
而一只兔子活 10 天,f ( i )+ … f ( i-9 )就是第 i 天的兔子数量
计算机算不下去了
========
代码如下
<?php
function getRabbit($day)
{
//第 1 天有 1 只兔子
$str = ‘1’;
//从第 2 天开始遍历兔子窝
for ($i = 0; $i < $day – 1; $i++) {
//昨天记录的兔子只数
$len = strlen($str);
for ($m = 0; $m < $len; $m++) {
//取出一只兔子
$num = $str[$m];
//让它的年龄增加 1 天
$num++;
//5-10 天的兔子, 要生 1 只兔子
if ($num >= 5 && $num <= 10) {
$str .= 1;
}
//用第 a 天表是第 10 天
$num = $num == 10 ? ‘a’ : $num;
//记录这只兔子新的年龄
$str[$m] = $num;
}
//第 11 天的兔子已经去世
$str = str_replace(‘b’, ”, $str);
$count = strlen($str);
$date = $i + 2;
echo “第{$date}天有{$count}只兔子<br>”;
}
}
$a = 61;
getRabbit($a);
就这个意思,已经把自己绕晕乎了。
//从第 2 天开始触发循环
for ($i = 0; $i < $day – 1; $i++) {
//先保存昨天记录
$yesterday = $arr;
/**
* 遍历而生成今天兔子年龄的统计情况:
* 1. 今天 1 天大的兔子数量, 是昨天 4-9 天大的兔子的数量的总和, 因为它们今天都到了生育年龄, 各生了 1 只兔子
* 2. 好比: 昨天 2 天大的兔子, 就是今天 3 天大的兔子
*/
foreach ($arr as $k => $v) {
$arr[$k] = $k == 1 ? $yesterday[4] + $yesterday[5] + $yesterday[6] + $yesterday[7] + $yesterday[8] + $yesterday[9] : $yesterday[$k – 1];
}
}
//返回兔子总数
return array_sum($arr);
}
echo getRabbit(100); //第 100 天有 3040556004272 只兔子
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
long[] rabbits = new long[100];
rabbits[0] = 1;
long a=0,b=0,c=0;
Console.WriteLine(“第 1 天有 1 只兔子”);
for (int i = 1; i <= 99; i++)
{
if (i >= 9)
{
for (int j = 0; j <= 9; j++)
{
rabbits[i – j] -= rabbits[i – 9];
}
}
a = rabbits[i – 1];
if (i < 4)
{
b = 0;
}
else
{
b= rabbits[i – 4];
}
if (i < 9)
{
c = 0;
}
else
{
c = rabbits[i – 9];
}
rabbits[i] = a + b – c;
Console.WriteLine(“第{0}天有{1}只兔子,新増{2}只”, i + 1, rabbits[i],b-c);
}
long d=0;
for (int i = 91; i <= 99; i++)
{
Console.WriteLine(“{0}岁的有{1}个”, 100 – i, rabbits[i] – rabbits[i-1]);
d += rabbits[i] – rabbits[i – 1];
}
Console.WriteLine(d);
Console.WriteLine(d – rabbits[99]);
Console.ReadKey();
}
}
}
基本思想与 12 一致,但在第 n(n>=10)天后,从第 n-9 天到第 n 天要减去第 n-9 天的数量,否则会重复计算。
不过有更简单但不直观的算法,不减去第 n-9 天的数量,算出 92-100 天的增量后相加就是第 100 天的数量
for i in range(100):
if 4 <= i < 10:
for j in range(i-3):
dp[i] += dp[j]
elif i >= 10 :
for j in range(i-9, i-3):
dp[i] += dp[j]
if i <= 9:
print(f’day {i+1} total: {sum(dp[:i+1])}’)
else:
print(f’day {i+1} total: {sum(dp[i-9:i+1])}’)
“““
对于 11 天以后,只考虑各自 5-10 天里每天新增的兔子数量