5

C语言每日一练——第63天:狼追兔子问题

 2 years ago
source link: https://blog.csdn.net/weixin_43772810/article/details/121666578
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

C语言每日一练——第63天:狼追兔子问题

置顶 小辉_Super 2021-12-02 07:26:21 28908
分类专栏: # 每日一练C 文章标签: c语言
专栏收录该内容
64 篇文章 579 订阅

C语言每日一练
2021年12月2日

一只兔子躲进了10个环形分布的洞中的一个。狼在第一个洞中没有找到兔子,就隔一个洞,到第3个洞去找;也没有找到,就隔2个洞,到第6个洞去找;以后每次多一个洞去找兔子……这样下去,如果一直找不到兔子,请问兔子可能在哪个洞中?

思路:
定义一个数组hole[10]hole[0]对应第一个洞,初始化时将数组值全部设置为0。在一个循环中按照题目规定的顺序给数组hole[i]赋值——将狼找过的洞对应的数组hole[i]赋值为1。

由于洞是环形分布的,所以我选择用while循环,循环因子i代表洞的编号,i每次增加的值设为cnt(初始值为2),每循环一次,cnt都加1,即i += cnt++;i必须在0~9的范围内,所以还需要使用i %= 10;i对10进行取余。

这道题的规律不好推算(下文我进行了简单的推算),但我们可以限定狼找兔子的最大次数,即循环次数,现实中狼也不可能永远守在兔子窝旁边吧。。。
最后,遍历整个hole数组,如果值为0,说明没被狼找过,兔子可能在该洞中。

#define HOLE_NUMBER       10    //洞的数量
#define MAX_SEARCH_TIMES  10000 //最大寻找次数

#include <stdio.h>

int main()
{
    int hole[HOLE_NUMBER] = {0};  //全部初始为0
    int i = 0, cnt = 2;           //隔一个洞,所以cnt=2
    while(cnt < MAX_SEARCH_TIMES + 2)
    {
        hole[i % HOLE_NUMBER] = 1; //1表示狼已经找过该洞
        i += cnt++;                //狼到i洞去找兔子,cnt表示下一次要隔几个洞
    }
    for(i = 0; i < HOLE_NUMBER; i++)
        if(hole[i] == 0)          //0表示没被狼找过
            printf("兔子可能躲在第%d个洞中。\n", i + 1);
    return 0;
}

在这里插入图片描述


  • 网上有一些人是使用递归函数实现的,但其实原理都一样,只是实现方式不同。

  • 既然狼总是找不到兔子,说明在某次寻找之后,狼就进入了一个无限重复的循环当中,那么到底是从哪次开始的呢?
    这应该算是一个数学问题,根据题意,我们可以得出一个递归公式f(n)=f(n-1)+n (n > 1)f(n)表示第n次找的洞,目前已知f(1)=1
    由于本人数学分析能力不是很强,所以我直接使用笨方法——列举找规律
    当我列到21次时,发现开始重复了:
    前20项:1 3 6 10 5 1 8 6 5 5 6 8 1 5 10 6 3 1 10 10
    20项后:1 3 6 10...
    也就是说我程序中的MAX_SEARCH_TIMES不用设置成那么大的值,设置为20即可。

原文链接:http://c.biancheng.net/cpp/html/3367.html
原文有详细的思路讲解(思路和我的大体相同,应该说我参考了他的思路)

#include <stdio.h>
int main()
{
    int n=0, i=0, x=0;
    int a[11];
    for(i=0; i<11; i++)  /*设置数组初值*/
        a[i]=1;
    for(i=0; i<1000; i++)  /*穷举搜索*/
    {
        n+=(i+1);
        x=n%10;
        a[x]=0;  /*未找到,置0*/
    }
    for(i=0; i<10; i++)  /*输出结果*/
    {
        if(a[i])
            printf("可能在第%d个洞\n", i);
    }
    return 0;
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK