免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4134 | 回复: 17
打印 上一主题 下一主题

经典猫吃鼠的c算法问题为何总是1? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-31 10:27 |只看该作者 |倒序浏览
5可用积分
要求如下:
有一只猫抓了n (n>1)个老鼠后向老鼠宣布:老鼠按自然数进行编号(1~n),并按自然数顺序排队,以后先后次序不准变;于是猫每天吃掉编号为奇数的老鼠,剩下的老鼠再按原次序进行自然数编号,直至某一天只剩下一只小老鼠;而该小老鼠是猫从第一天起就想吃掉的那只,请问这只小老鼠的最初编号是几?

我的程序如下:
#include <iostream.h>
#include <assert.h>

struct mouse                          //链“节点”类声明
{
  int n;
  mouse *nextptr;
};

int cat_mouse(int num)                     //函数定义
{
mouse *headptr=0,*tailptr=0,*frontptr,*p;
int i;

//先把1个老鼠加入链作为链首节点
headptr=tailptr=new mouse;
assert(headptr!=NULL);                      //动态内存分配异常处理
headptr->n=1;                           //老鼠的编号
headptr->nextptr=NULL;

//在链尾再添加n-1个老鼠
for(i=2;i<=num;++i)
{p=new mouse;
assert(p!=NULL);
p->n=i;
cout<<p->n<<" ";
tailptr->nextptr=p;
tailptr=p;
}
tailptr->nextptr=NULL;                       //设置链尾节点的“下一节点地址”为空

//开始删除老鼠
while(headptr!=tailptr)                  //每循环一次,删除链上的奇节点,直至只剩下1个节点
{ p=headptr->nextptr;                     //链的首节点总是先被删除
delete headptr;                       //析构首节点
headptr=frontptr=p;                      //本次循环的第2个节点成为链的首节点
i=2;                            //从第2个节点开始循环:删除链的奇节点
while(p!=NULL)                        //从2开始循环至链尾节点
{if((i%2)==1)                       //是奇节点
{if (p->nextptr==NULL)                     //如果该奇节点是最后一个节点
{frontptr->nextptr=NULL;                  //前一节点成为链的尾节点
tailptr=frontptr;
delete p;
p=NULL;                        //因本循环的判断条件是p!=NULL,到链尾,所以置为0
}
else                                //是奇节点但不是尾节点,删除
{frontptr->nextptr=p->nextptr;               //从链上删除该奇节点
delete p;
p=frontptr->nextptr;                       //下一节点的地址已保存在frontPtr的nextPtr中
++i;
}
}
else
{frontptr=p;
p=p->nextptr;
++i;
}
}
}
return headptr->n;                                  //返回最后一个节点的编号
}

void main()                                         //主函数
{
  int i, num;
  do{cout<<"\n请输入老鼠的只数(大于1,输入0退出):";
          cin>>num;
  if(num>1)
  {i=cat_mouse(num);
  cout<<"最后剩下的一只老鼠是:"<<i<<endl;
   }
  }while(num!=0);
}

为何运行算法后只剩一只老鼠时,不管我输入多少数字 那老鼠的最初编号总为1???

还有如果猫每天吃掉编号为偶数的老鼠 那老鼠的最初编号是几?如何改程序,我是新手请大家指点下,谢谢了!!

最佳答案

查看完整内容

就是找比n小的最大的且是2的幂的数。

论坛徽章:
0
2 [报告]
发表于 2007-10-31 10:27 |只看该作者
就是找比n小的最大的且是2的幂的数。

论坛徽章:
0
3 [报告]
发表于 2007-10-31 10:37 |只看该作者

回复 #1 zw047 的帖子

不对吧,你在删除奇数点的同时,偶数点的值要除以2啊,不然循环能下去么。。
答案肯定是比n小的最大那个2的幂吧
比如n=7,那么第一次吃掉1357,剩下246,同时除以2,得到123,那么4是最后一个被吃掉的

论坛徽章:
0
4 [报告]
发表于 2007-10-31 12:21 |只看该作者
#include <stdio.h>

int main(int argc, char *argv[])
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int n;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int m = 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d", &n);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i = 1; i < 31; i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (n >= (m << i))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%u\n", m << (i - 1));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
5 [报告]
发表于 2007-10-31 12:42 |只看该作者
2^(log2n)

[ 本帖最后由 sanbiangongzi 于 2007-10-31 12:48 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-10-31 12:48 |只看该作者
不用数组,我的要求是上面输入任意数n,求老鼠编号,按我上面的程序咋改?能帮我改一下吗

谢谢了!

论坛徽章:
0
7 [报告]
发表于 2007-10-31 13:06 |只看该作者
原帖由 zw047 于 2007-10-31 12:48 发表
不用数组,我的要求是上面输入任意数n,求老鼠编号,按我上面的程序咋改?能帮我改一下吗

谢谢了!

你是模拟了整个吃老鼠的过程,数很大的话会超时的。

论坛徽章:
0
8 [报告]
发表于 2007-10-31 13:12 |只看该作者
那猫每天吃掉编号为”偶“数的老鼠,小老鼠的最初编号是几?就是1了吗?

论坛徽章:
0
9 [报告]
发表于 2007-10-31 13:14 |只看该作者
原帖由 zw047 于 2007-10-31 13:12 发表
那猫每天吃掉编号为”偶“数的老鼠,小老鼠的最初编号是几?就是1了吗?

对。

论坛徽章:
0
10 [报告]
发表于 2007-10-31 13:24 |只看该作者
那我的程序咋该?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP