已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
有m个海盗得到了一笔宝藏,但海盗头想自己独吞。于是他发明了一种“公平”的方法来分财宝。他告诉大家,明天日出的时候我们围成一圈开始数数字,从我开始。我的编号是1。每次数到数字n,就把这个海盗扔进海里。最后一个留下来的海盗独得全部财宝。如果m10且n3,请求出最小的m和n。代码:#include#includestruct renint num;struct ren *next;struct ren *head;void main()void renshu();int flag,j;flag=1;while(flag=1)renshu();printf(是否还有继续:n 1.是n 2.否n);scanf(%d,&j);flag=j;if(j=1)system(pause);system(cls);void renshu()int flag,i,m,n,k,t,q;/m是人数,N是要丢掉的第几个人,I是编号,q=2证明循环没问题,q=1说明输入的数据出错struct ren *p,*d;t=1;/t用来计数的flag=1;/flag=1表示不符合要求,flag=2表示可以while(flag=1)printf(输入海盗人数:);/输入海盗人数scanf(%d,&m);printf(输入要丢掉的数字:);/输入第几个人要扔掉scanf(%d,&n);if(m10&n3)/判断输入的数据是否符合要求flag=2;/跳出while循环elseprintf(不符合要求,请重新输入!n);/ flag=2;/for(i=1;inum=i;p-next=NULL;head=p;d=p;elsep=(struct ren *)malloc(sizeof(struct ren);p-num=i;p-next=NULL;d-next=p;d=p;/开始循环d=head;printf(共有%d个人n,i-1);while(d)/只是显示人数printf(%dn,d-num);d=d-next;i=n;d=head;p=head;while(t!=m)/没进行一次就丢掉一个人while(i1)d=p;p=p-next;if(p=NULL)p=head;i=i-1;if(p=head)printf(释放了%d号n,p-num);printf(出错!n);q=0;k=t;/看看是哪里的T出错t=m;/结束程序elseif(p-next!=NULL)/链表未结束d-next=p-next;printf(释放了%d号n,p-num);t=t+1;free(p);p=NULL;p=d-next;i=n;else/链表结束d-next=NULL;printf(释放了%d号n,p-num);t=t+1;q=2;/释放成功free(p);p=NULL;p=head;i=n;if(q=2)printf(确定人数为%d个!n丢掉的数字是%dn,m,n);解析:此问题的解决需要运用链表的相关用法。所以我们要熟练掌握链表的运用。首先理清思路,这类问题需要一个链表,并且实现链表的循环,这样才能解决问题。接下来我就讲解链表的部分。现希望你能看清楚这代码,并且现运行这代码。接下来我只说链表部分。for(i=1;inum=i;p-next=NULL;head=p;d=p;elsep=(struct ren *)malloc(sizeof(struct ren);p-num=i;p-next=NULL;d-next=p;d=p;这段代码是建立链表,初学者应该也能明白。其中p-num=i;我用来标记海盗每个人的位置,应这道题的内容,第一个海盗不能被扔海里,这是此题的要求,不解释。d=head;printf(共有%d个人n,i-1);while(d)/只是显示人数printf(%dn,d-num);d=d-next;i=n;d=head;p=head;while(t!=m)/没进行一次就丢掉一个人while(i1)d=p;p=p-next;if(p=NULL)p=head;i=i-1;if(p=head)printf(释放了%d号n,p-num);printf(出错!n);q=0;k=t;/看看是哪里的T出错t=m;/结束程序elseif(p-next!=NULL)/链表未结束d-next=p-next;printf(释放了%d号n,p-num);t=t+1;free(p);p=NULL;p=d-next;i=n;else/链表结束d-next=NULL;printf(释放了%d号n,p-num);t=t+1;q=2;/释放成功free(p);p=NULL;p=head;i=n;if(q=2)printf(确定人数为%d个!n丢掉的数字是%dn,m,n);上面这部分才是这个代码的关键。首先,这要经过多次循环,因为只能留下一个人,就是第一个人。还有,当整个游戏未结束而链表结束时,则要连接尾部和头部,if(p=NULL)p=head;这个代码就是连接头部和尾部。如果运行了这段代码,if(p=head)printf(释放了%d号n,p-num);printf(出错!n);q=0;k=t;/看看是哪里的T出错t=m;/结束程序就意味着输入的数据出错了,因为扔掉了第一个。其中q=0;是说数据出错。而q=2;则表示此次运行成功,从头到尾都成功就行了。而t=m;意味着while(t!=m)循环要结束了。而这段代码:while(i1)d=p;p=p-next;if(p=NULL)p=head;i=i-1; 而这段代码,只能循环一次,这个if(p-next!=NULL)/链表未结束d-next=p-next;printf(释放了%d号n,p-num);t=t+1;free(p);p=NULL;p=d-next;i=n;else/链表结束d-next=NULL;printf(释放了%d号n,p-num);t=t+1;q=2;/释放成功free(p);p=NULL;p=head;i=n;这里的if和else是一对的,一次只能执行其中一段。if(p-next!=NULL)/链表未结束d-next=p-next;printf(释放了%d号n,p-num);t=t+1;free(p);p=NULL;p=d-next;i=n;上面这段是循环时未到尾节点,所以就继续。else/链表结束d-next=NULL;printf(释放了%d号n,p-num);t=t+1;q=2;/释放成功free(p);p=NULL;p=head;i=n;这段是循环到尾节点是,必须把尾部和头部连接。至于T的作用,当每一次数数都成功,就会自动加1,直到t=m。k什么作用。最后,关于此程序,用12和5就可以证明此程序时对的。当然把这段if(m10&n3)/判断输入的数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CRRA 1314-2023存储设备回收利用技术导则
- T/TMAC 277-2025高精度智能电能计量箱通用技术规范
- T/GDMDMA 0041-2025三维硬性光学内窥镜三维视觉性能检测方法
- T/CI 534-2024承插型盘扣式钢管脚手架及托梁支撑体系
- T/CACE 0179-2025铝电解废耐火材料基霞石粉(砂)
- T/CRRA 0304-2022废塑料交易规范
- AI在西班牙语领域的应用
- 2025-2026学年河北省迁安市初中政治七年级期末上册自我评估黑金试题附答案
- 2026学年河南省辉县市四年级语文期末自测模拟思维拓展题(详细参考解析)详细答案和解析
- Photoshop期末考试试题及详细答案解析
- 2026重庆三峰环境集团股份有限公司招聘82人考试模拟试题及答案解析
- T/CI 878-2025钠离子电池用生物质硬炭负极材料技术要求
- 2026年期权开户考试题库及答案
- 《人民当家作主》教学课件 - 2026-2027 学年统编版(新教材)小学道德与法治五年级上册
- 2026年04月自考03200预防医学(二)试题及答案
- 2026年法治思想试题库及答案
- 2026海南中考考前冲刺 英语考纲核心词汇与书面表达高级句型速览
- 大学英语四级词汇表 (完美打印版)
- 私募股权投资基金基础知识全解析
- 2025年地质勘查安全规程试题及答案
- (正式版)XJJ 144-2022 《装配式墙板及免拆底模钢筋桁架楼承板应用技术标准 附条文说明》
评论
0/150
提交评论