前言
修改一下资料上的参考答案,自己写的和网上对照答案应该没错,不过还有改进的余地。继续加油
正文
一只小兔子躲进了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
和资料中的类似
i | 1 | 2 | 3 | 4 | … |
---|---|---|---|---|---|
pos | 1 | 3 | 6 | 10 | … |
规律: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