南师C:狼抓兔子问题

前言

修改一下资料上的参考答案,自己写的和网上对照答案应该没错,不过还有改进的余地。继续加油

正文

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

代码一

溢出的状况需要多次考虑,少考虑一种答案就错了。

#include <stdio.h>
int main()
{
	int n[10];
	int count=0,i=0,j=0,k=1,cnt=1;
	for(i=0;i<10;i++){
		n[i]=0;
	}
	n[0]=1; //第一个洞
	while(cnt<100){
		j++;
		count++; //跳过的洞数
		if(count==k){//当跳过的洞数==需要间隔的洞数 
			j=j+1; 
			n[j%10]=1;//j%10防止j+1溢出 
			cnt++;
			count=0;
			k++;//隔洞个数+1 
		}
		if(j==10){//防止j++溢出 
		   j=j%10;
		}
	}
	for(i=0;i<10;i++){
		   if(n[i]==0)
		       printf("兔子可能藏在 %d 号\n",i+1);
		} 
} 

在这里插入图片描述

代码二

https://blog.51cto.com/zlfwmm/1617428
和资料中的类似

i1234
pos13610

规律:pos(i+1)=pos(i)+i+1

#include <stdio.h>
void main()
{
    bool hole[11]={0}; //10个洞
    int pos=1;//从1号开始存
    for(int i=1;i<21;i++)  //第21次狼又回到了1号洞(直接100也可)
    {
        hole[pos]=true;  //狼找过的洞
        pos+=i+1;
        pos=pos%10;  
    }
    for(int i=1;i<=10;i++)
        if(!hole[i]) printf("兔子可能在第%d洞中\n",i);
}

代码三(递归)

看到网上一个更优秀的代码,利用递归
f(n)=f(n-1)+n

#include<stdio.h>
int dong(int n)
{
	if(n==1)
		return 1;
	return dong(n-1)+n;
}
int main()
{
int a[11];int i,s;
for(i=0;i<10;i++)
a[i]=1;              //给所有洞做标记
for(i=0;i<100;i++)
{
	s=dong(i+1)%10;
	a[s]=0;             //狼找到了洞,修改标记
	if(s==0)
		printf("狼在第%d次找到了第%d个洞\n",i+1,s+10);
	else
	printf("狼在第%d次找到了第%d个洞\n",i+1,s);
}
for(i=0;i<10;i++)
{if(a[i]==1)            
printf("%d个洞为兔子藏身的地方\n",i);       //标记未修改过的地方,为兔子藏身的地方
}
return 0;
}

来自:https://blog.csdn.net/qq_41911158/article/details/86561222

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值