看见一个有趣逻辑问题。绵羊生宝宝问题,求讨论!

Z张天择 2019-03-15 02:45:28
绵羊在出生1年后,就有繁殖能力,一对绵羊每年能生出两支小羊。绵羊十岁就会死去,问20年后有多少支羊?
(初始有一对绵羊,不考虑近亲^_^。生的永远一公一母。)
做了一点点思维导图,但是逻辑还是混乱的!求讨论!!!!!!
...全文
2341 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
破音小跳蛙 2019-03-19
  • 打赏
  • 举报
回复
自己写了一个程序,第20年应该是521728只羊
#include "stdafx.h"
#include"stdio.h"
#include"math.h"


int _tmain(int argc, _TCHAR* argv[])
{
int amount,amount2;
int i;
for(i=1;i<11;i++)
{
amount=pow(2.0,i);
printf("第%d年兔子的数量是%d\n",i,amount);}
if(i>=11)
{amount=pow(2.0,i)-2;
i++;
printf("第%d年兔子的数量是%d\n",i,amount);
while(i<20)
{
amount2=pow(2.0,(i-11));
amount=2*amount-amount2;
i++;
printf("第%d年兔子的数量是%d\n",i,amount);
}}return 0;}


是小白,也不知道对不对哈哈哈,不过我在草纸上简单算了一下
dddjjj-sicnu 2019-03-19
  • 打赏
  • 举报
回复
第11年的时候 死亡1对羊,因为第10年的死了一对
qq_41844219 2019-03-19
  • 打赏
  • 举报
回复
我记得这个好像是斐波那次数列吧,具体名字是不是这个忘了
xiaoxiangqing 2019-03-18
  • 打赏
  • 举报
回复
应该要用递归才能解决
霸王殿·独步 2019-03-18
  • 打赏
  • 举报
回复
/*
我是按照我的理解做的
第一年那对最初始的羊A,
第二年(年初)他们开始生出第一对羊B,
第三年(年初)A,B生出他们的下一代
以此类推
直到第十一年年初,第一年的羊死去
第十二年初,第二年的羊死去
以此类推
所以
定义一个有二十个元素的数组A[20+1]分别记录每一年羊的对数,
在从十一年(A[11])以后每年都减去他前十年(A[11-10])的对数
代码如下
运行结果为 1028096
*/ #include "pch.h"
#include <iostream>
#define MY 20+1
using namespace std;
unsigned long A[MY];
int main()
{
for (int a = 1; a < MY; a++)
{
if (a != 1)
{
if (a <= 10)
{
A[a] = A[a - 1] * 2;
}
else
{
A[a] = (A[a - 1] - A[a - 10]) * 2;
}
}
else
{
A[a] = 1;
}
}
cout << "第二十年羊的数量为:" << A[20] * 2 << endl;
return 0;
}
klituoot 2019-03-18
  • 打赏
  • 举报
回复
引用 11 楼 以专业开发人员为伍 的回复:
只知道“分解概念”是个傻傻的纠结是非的做法,真正的智能不是纠结“是什么”而是要理解“如何做”。所以思维导图,既可以用来分解概念,其实由容易让人变得小肚鸡肠。我们要从算法来理解逻辑,而不是用什么思维导图!
static void Main(string[] args)
{
    var 只有羊的世界 = new List<A> { new A { 公母一对 = 1, 岁数 = 0 } };
    for (var i = 2; i <= 21; i++)
    {
        只有羊的世界.RemoveAll(a => a.岁数 == 10);   //先死一批
        foreach (var y in 只有羊的世界)    //长大了一批
            y.岁数++;
        只有羊的世界.Add(new A { 公母一对 = 只有羊的世界.Count });    //生出来一批
        Console.WriteLine("第{0}年共有{1}头羊", i, 只有羊的世界.Sum(a => a.公母一对) * 2);
    }
    Console.WriteLine(".......按任意键退出");
    Console.ReadKey();
}

class A
{
    public int 岁数;
    public int 公母一对;
}
当然细节可以调整,但是大体逻辑看得清楚,20年后有220头羊,因为刚出生的小羊会不配对,所以说“头10年的羊数每年翻倍”是错误的,只有10年之后则更要不但考虑刚生的小羊还要考虑有些羊没能转年就先行嗝屁了。
看不懂能发数据吗???
slinwei1232 2019-03-18
  • 打赏
  • 举报
回复
学习了
好帖子,,帮帮的
  • 打赏
  • 举报
回复
递推关系,考虑如下序列:
year ... -3 -2 -1 0 1 2 3 ... n
sheep 0 0 0 2 4 8 16

a(n) = (a(n-1) - a(n-10) + a(n-11)) * 2
a(20) = 2072584
  • 打赏
  • 举报
回复
引用 楼主 Z张天择的回复:
绵羊在出生1年后,就有繁殖能力,一对绵羊每年能生出两支小羊。绵羊十岁就会死去,问20年后有多少支羊?
(初始有一对绵羊,不考虑近亲^_^。生的永远一公一母。)
做了一点点思维导图,但是逻辑还是混乱的!求讨论!!!!!!
我的意思是斐波拉契数列的原理,数字列出来就懂了
  • 打赏
  • 举报
回复
引用 楼主 Z张天择的回复:
绵羊在出生1年后,就有繁殖能力,一对绵羊每年能生出两支小羊。绵羊十岁就会死去,问20年后有多少支羊?
(初始有一对绵羊,不考虑近亲^_^。生的永远一公一母。)
做了一点点思维导图,但是逻辑还是混乱的!求讨论!!!!!!
斐波拉契数列 了解一下,这个秒懂
cp0328 2019-03-17
  • 打赏
  • 举报
回复
把斐波那契改一改 减去 n-10的数量
Nick大帅仔 2019-03-17
  • 打赏
  • 举报
回复
引用 24 楼 等不到的回忆 的回复:
[quote=引用 9 楼 Nick_Don的回复:]我个人觉得答案是 1037312。按一对生产一对来算,一到十年,增长速度为2^0到2^9,第十一年死去原始一对,第十二年到第二十年死去一开始每年增加的2^0到2^8对。代码如下,请指正:
double nums = 0;
for (int i = 1; i <= 20; i++)
{
if(i<=10)
nums = Math.Pow(2, i - 1);
if (i == 11)
nums=(nums-1)*2;
if (i > 11)
nums = (nums - Math.Pow(2, i - 12)) * 2;
Console.WriteLine(nums*2);
Console.ReadLine();
}
Console.ReadLine();

还有,你的代码不对啊[/quote]
因为我nums代表对数,输出的乘2
不放弃每一天 2019-03-17
  • 打赏
  • 举报
回复
大佬求解答,我也想知道
等不到的回忆 2019-03-17
  • 打赏
  • 举报
回复
引用 9 楼 Nick_Don的回复:
我个人觉得答案是 1037312。按一对生产一对来算,一到十年,增长速度为2^0到2^9,第十一年死去原始一对,第十二年到第二十年死去一开始每年增加的2^0到2^8对。代码如下,请指正:
double nums = 0;
for (int i = 1; i <= 20; i++)
{
if(i<=10)
nums = Math.Pow(2, i - 1);
if (i == 11)
nums=(nums-1)*2;
if (i > 11)
nums = (nums - Math.Pow(2, i - 12)) * 2;
Console.WriteLine(nums*2);
Console.ReadLine();
}
Console.ReadLine();
还有,你的代码不对啊
等不到的回忆 2019-03-17
  • 打赏
  • 举报
回复
你没成2,可以。和我想法一样。他最后问多少只。不要大意
等不到的回忆 2019-03-17
  • 打赏
  • 举报
回复
总共有2074624只羊。
Z张天择 2019-03-16
  • 打赏
  • 举报
回复
引用 14 楼 sp1234_maJia 的回复:
计算结果: 第2年共有4头羊 第3年共有8头羊 第4年共有16头羊 第5年共有32头羊 第6年共有64头羊 第7年共有128头羊 第8年共有256头羊 第9年共有512头羊 第10年共有1024头羊 第11年共有2048头羊 第12年共有4092头羊 第13年共有8180头羊 第14年共有16352头羊 第15年共有32688头羊 第16年共有65344头羊 第17年共有130624头羊 第18年共有261120头羊 第19年共有521984头羊 第20年共有1043456头羊 第21年共有2085888头羊 .......按任意键退出 找这个控制台“标记”操作找了好久!上面的代码写错了一个 sum 函数:
static void Main(string[] args)
{
    var 只有羊的世界 = new List<A> { new A { 公母一对 = 1, 岁数 = 0 } };
    for (var i = 2; i <= 21; i++)
    {
        只有羊的世界.RemoveAll(a => a.岁数 == 10);   //先死一批
        foreach (var y in 只有羊的世界)    //长大了一批
            y.岁数++;
        只有羊的世界.Add(new A { 公母一对 = 只有羊的世界.Sum(a => a.公母一对) });    //生出来一批
        Console.WriteLine("第{0}年共有{1}头羊", i, 只有羊的世界.Sum(a => a.公母一对) * 2);
    }
    Console.WriteLine(".......按任意键退出");
    Console.ReadKey();
}

class A
{
    public int 岁数;
    public int 公母一对;
}
Z张天择 2019-03-16
  • 打赏
  • 举报
回复
引用 14 楼 sp1234_maJia 的回复:
计算结果: 第2年共有4头羊 第3年共有8头羊 第4年共有16头羊 第5年共有32头羊 第6年共有64头羊 第7年共有128头羊 第8年共有256头羊 第9年共有512头羊 第10年共有1024头羊 第11年共有2048头羊 第12年共有4092头羊 第13年共有8180头羊 第14年共有16352头羊 第15年共有32688头羊 第16年共有65344头羊 第17年共有130624头羊 第18年共有261120头羊 第19年共有521984头羊 第20年共有1043456头羊 第21年共有2085888头羊 .......按任意键退出 找这个控制台“标记”操作找了好久!上面的代码写错了一个 sum 函数:
static void Main(string[] args)
{
    var 只有羊的世界 = new List<A> { new A { 公母一对 = 1, 岁数 = 0 } };
    for (var i = 2; i <= 21; i++)
    {
        只有羊的世界.RemoveAll(a => a.岁数 == 10);   //先死一批
        foreach (var y in 只有羊的世界)    //长大了一批
            y.岁数++;
        只有羊的世界.Add(new A { 公母一对 = 只有羊的世界.Sum(a => a.公母一对) });    //生出来一批
        Console.WriteLine("第{0}年共有{1}头羊", i, 只有羊的世界.Sum(a => a.公母一对) * 2);
    }
    Console.WriteLine(".......按任意键退出");
    Console.ReadKey();
}

class A
{
    public int 岁数;
    public int 公母一对;
}
我跟您的结果不一样,我算的是每只羊只生九次!
Z张天择 2019-03-16
  • 打赏
  • 举报
回复
引用 1 楼 正怒月神 的回复:
感觉应该是 先算出 前十年 double a = Math.Pow(2, 10); 然后11年开始,每次减去 a = (a - (2 * i)) * 2; 循环10次。 大概是1040432 不能确保正确
这样是否正确?
sp1234_maJia 2019-03-16
  • 打赏
  • 举报
回复
计算结果: 第2年共有4头羊 第3年共有8头羊 第4年共有16头羊 第5年共有32头羊 第6年共有64头羊 第7年共有128头羊 第8年共有256头羊 第9年共有512头羊 第10年共有1024头羊 第11年共有2048头羊 第12年共有4092头羊 第13年共有8180头羊 第14年共有16352头羊 第15年共有32688头羊 第16年共有65344头羊 第17年共有130624头羊 第18年共有261120头羊 第19年共有521984头羊 第20年共有1043456头羊 第21年共有2085888头羊 .......按任意键退出 找这个控制台“标记”操作找了好久!上面的代码写错了一个 sum 函数:
static void Main(string[] args)
{
    var 只有羊的世界 = new List<A> { new A { 公母一对 = 1, 岁数 = 0 } };
    for (var i = 2; i <= 21; i++)
    {
        只有羊的世界.RemoveAll(a => a.岁数 == 10);   //先死一批
        foreach (var y in 只有羊的世界)    //长大了一批
            y.岁数++;
        只有羊的世界.Add(new A { 公母一对 = 只有羊的世界.Sum(a => a.公母一对) });    //生出来一批
        Console.WriteLine("第{0}年共有{1}头羊", i, 只有羊的世界.Sum(a => a.公母一对) * 2);
    }
    Console.WriteLine(".......按任意键退出");
    Console.ReadKey();
}

class A
{
    public int 岁数;
    public int 公母一对;
}
加载更多回复(16)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧