假期思索出一乌龟问题,但无法解答,各位进来看看

liuyunyijiu 2011-02-19 08:26:06
乌龟问题:
一乌龟第一年生10只小乌龟,第二年生9只,以后逐年递减,至第10年生下一只乌龟后死掉。假设孵出的小乌龟从出生开始,到第10年与老乌龟命运相同,如第一年出生的10只乌龟在第十一年生下10只小乌龟。问百年后有多少乌龟?

本人思索了不少时间,但却无法得到一种正确的解法,还望各位不吝赐教。
...全文
93 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
liuyunyijiu 2011-02-20
[Quote=引用 2 楼 phil999 的回复:]
楼主是不是在做寒假作业
[/Quote]

大三,哪来什么寒假作业,不过突然想出的问题觉得值得思索一下而已。
顺便说一下,能不能直接说下思路,看别人的代码很麻烦,而且这是个指数级问题,数字太大恐怕求不出来。
回复
xyytuo 2011-02-20
回复
兔子党-顾问 2011-02-20
没等到运行结果。不确定是否正确。贴一个。
public static int GetCountWG(int y)
{
Func<int, int> GetChildren = year => year < 0 ? 0 : 10 - year;
List<int> wg_list = new List<int>();//记录每个乌龟的年龄
wg_list.Add(0);//初始化一个新生乌龟
for (int i = 0; i < y; i++)
{
GC.Collect();
Console.Write("第{0}年:", i);
List<int> wg_list_new = new List<int>();//此年新生儿
for (int j = 0; j < wg_list.Count; j++)
{
int[] new_wgs = new int[GetChildren(wg_list[j])];
for (int k = 0; k < new_wgs.Length; k++) new_wgs[k] = -10;//10年后才能生
wg_list_new.AddRange(new_wgs);

wg_list[j]++;
if (wg_list[j] > 10)
{
wg_list.RemoveAt(j);
j--;
}
}
wg_list.AddRange(wg_list_new);
Console.WriteLine(wg_list.Count);
}
return wg_list.Count;
}
回复
liuyunyijiu 2011-02-20
[Quote=引用 8 楼 phil999 的回复:]
这个不难。我上面的代码不行,换个思路。用一个字典保存每个年龄的乌龟数量,因为结果比较大,可以用……
[/Quote]

思路不错,受教了。
回复
Yujiexiaoyu 2011-02-20
唉,数学题啊!
回复
phil999 2011-02-20
[Quote=引用 7 楼 liuyunyijiu 的回复:]

引用 2 楼 phil999 的回复:
楼主是不是在做寒假作业


大三,哪来什么寒假作业,不过突然想出的问题觉得值得思索一下而已。
顺便说一下,能不能直接说下思路,看别人的代码很麻烦,而且这是个指数级问题,数字太大恐怕求不出来。
[/Quote]

这个不难。我上面的代码不行,换个思路。用一个字典保存每个年龄的乌龟数量,因为结果比较大,可以用 Dictionary<int, BigInteger>。键表示年龄,值表示这个年龄的乌龟数量,比如 [10] 表示10岁乌龟的数量。每年会发生两件事,年龄增长和新乌龟诞生。年龄增长,[10] 放到 [11] 里,然后把 [9] 放到 [10] 里。计算新乌龟的数量,比如 12 岁的龟生 8 只,即 20 - 12,所有 12 岁的龟生下的的小龟一共是 [12] * (20 - 12),只有 11-20 岁的龟可以生小龟。按照这个思路,代码不难写。
回复
叶子 2011-02-19
结果严重超出int范围
回复
phil999 2011-02-19
[Quote=引用 4 楼 maco_wang 的回复:]

楼主的意思是乌龟只能活10年,并且小乌龟出生了就会生小乌龟?
[/Quote]

小乌龟出生10年后开始生小乌龟。我写那个模拟个体生死的代码太耗时了,没想到数量这么大。
回复
叶子 2011-02-19
楼主的意思是乌龟只能活10年,并且小乌龟出生了就会生小乌龟?
回复
phil999 2011-02-19
写了一个代码,一运行才发现,效率太差了

[code=C]
class Program
{
public static void Main()
{
World world = new World();
Tortoise first = new Tortoise(world);
world.TortoiseList.Add(first);

// 前十年,让第一只龟长长
for (int i = 0; i < 10; i++)
{
world.OnNewYear(EventArgs.Empty);
}

// 100 年,神龟虽寿,终为土灰
for (int i = 0; i < 100; i++)
{
world.OnNewYear(EventArgs.Empty);
}

Console.WriteLine(world.TortoiseList.Count);

Console.ReadKey();
}




}

public class World
{
public int Number;

public World()
{
this.Number = 0;
this.TortoiseList = new List<Tortoise>();
}

public List<Tortoise> TortoiseList { get; private set; }
public event EventHandler NewYear;
public void OnNewYear(EventArgs e)
{
if (NewYear != null)
{
NewYear(this, e);
}
}

}


public class Tortoise
{
World _world;
int _number;
public Tortoise(World world)
{
this.Age = 0;
_world = world;
this._number = ++_world.Number;
_world.NewYear += new EventHandler(_world_NewYear);

Console.WriteLine("第 {0} 只龟诞生", this._number);
}

void _world_NewYear(object sender, EventArgs e)
{
this.Age = this.Age + 1;
NewChildren();
if (this.Age > 20)
{
this.Die();
}
}

public int Age { get; private set; }

private void Die()
{
this._world.NewYear -= new EventHandler(_world_NewYear);
this._world.TortoiseList.Remove(this);
Console.WriteLine("第 {0} 只龟死去", this._number);
}

private void NewChildren()
{
if (this.Age < 11 || this.Age > 20)
{
return;
}

int count = 20 - this.Age + 1;

for (int i = 0; i < count; i++)
{
this._world.TortoiseList.Add(new Tortoise(this._world));
}
}
}

[/code]
回复
phil999 2011-02-19
楼主是不是在做寒假作业
回复
phil999 2011-02-19
回复
相关推荐
发帖
非技术区
创建于2007-09-28

7700

社区成员

.NET技术 非技术区
申请成为版主
帖子事件
创建了帖子
2011-02-19 08:26
社区公告
暂无公告