首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

金典耗子生子的算法有关问题

2012-03-12 
金典耗子生子的算法问题算法是我自己想得和传统算法不一样结果答案也不一样算法看起来是很合情合理的希望

金典耗子生子的算法问题
算法是我自己想得
  和传统算法不一样 结果答案也不一样
  算法看起来是很合情合理的 希望各位大哥可以帮帮我 代码里面的注释写得很清楚
[code=C/C++][/code]/*
有一对老耗子,每个月都生一对小耗子,
小耗子长到第三个月后(即从第四个月开始)
每个月又生一对小耗子,
假如耗子都不死,问2年后一共多少只耗子?
*/
#include <stdio.h>
int main(void)
{
/*
算法分析:先算出2年内生下的老鼠有几代,
每一代有多少只老鼠,
把每一代相加;就是最后老鼠的总数
*/
//第一对老耗子是耗子的祖宗,不算入耗子世代中计算
int month = 0, generations = 0, num = 0;
//generations 世代 month月份 num是总数

int sumGenerations = 0, numGenerations = 0, numMonth = 0;
//numYear是第二代代到第八代的耗子数
//numGenerations是每一代的耗子数
//numMonth是每一个月的耗子数

//把第二代当做第一代计算
for(generations = 1; generations < 8; generations++)
{
for(month = 1; month <= 24; month++)
{
if(month <= 3 * generations)
{
numMonth = 0;
}
else
{
numMonth++;
//printf("numMont==:%d\n",numMonth); 测试某一代每个月新生的耗子数
}
numGenerations += numMonth;
//printf("前%2d月的耗子:%d\n",month,numGenerations); 测试前month个月耗子的总数
}
//printf("第%d代%d\n",generations,numGenerations);测试第generations代的耗子数
sumGenerations += numGenerations;
//printf("第%d代总数是这么多:%d \n",generations,sumGenerations);测试第前generations代的耗子总数
numGenerations = 0;//初始化每一代的总数
}
num = (25 + sumGenerations) * 2;//25是第一代的24对加上最开始的那一对老耗子
printf("两年时间由一对老耗子繁养出来的耗子家族总数是%d只\n",num);
return 0;
}

[解决办法]

C/C++ code
#include <stdio.h>int main(){    int can[24] = {2, 2, 2};//can[0]表示1月有生育能力的耗子    int cannot[24] = {2, 4, 6};//cannot[0]表示1月没有生育能力的耗子    int i = 0, j = 0;    int rst;    can[0] = 2;    cannot[0] = 2;    for(i = 3; i < 23; i++)    {        can[i + 1] = can[i] + cannot[i - 2];        cannot[i + 1] = cannot[i] - cannot[i - 2] + can[i + 1];     }    rst = can[23] + cannot[23];    printf("%d\n", rst);    return 0;}
[解决办法]
C/C++ code
#include <stdio.h>int main(){    int can[24] = {2, 2, 2};//can[0]表示1月有生育能力的耗子    int cannot[24] = {2, 4, 6};//cannot[0]表示1月没有生育能力的耗子    int i = 0, j = 0;    int rst;        for(i = 3; i < 23; i++)    {        can[i + 1] = can[i] + cannot[i - 2];        cannot[i + 1] = cannot[i] - cannot[i - 2] + can[i + 1];     }    rst = can[23] + cannot[23];    printf("%d\n", rst);    return 0;} 

热点排行