黑马程序员技术交流社区
标题:
那到出卖耶稣的题目,有什么好点的思路吗?
[打印本页]
作者:
dawei233
时间:
2014-7-26 16:57
标题:
那到出卖耶稣的题目,有什么好点的思路吗?
本帖最后由 dawei233 于 2014-7-26 20:26 编辑
测试题已经上交了,但是那道耶稣的测试题,一直没什么思路。
1、围成一个圈,在程序要怎么控制;
2、要有一个变量来控制那些已经被剔除出去,也就是被点到3的人;
3、是不是每次被剔除出去之后,都要重新生成一个新的圈圈?
感觉好像需要用到数组,但是不知道要怎么控制。
知道的童鞋麻烦帮帮忙,可以不贴代码,说说思路也行。谢谢。
作者:
fantacyleo
时间:
2014-7-26 17:47
定义一个int数组,长度等于人数,这样下标就表示人的编号。没被剔除的,值为1,被剔除的,值为0,这样就可以区分,并始终使用一个数组。
开始数人,这个过程设计为一个死循环,需要三个变量:一是代表数组下标。二是记录是否数到3。三是记录数组中还有多少人未被剔除,当还剩1人时退出循环。前两个变量都涉及“绕圈”,也就是从0开始自增到一个目标数后重新归0。
作者:
rocki
时间:
2014-7-26 19:00
本帖最后由 rocki 于 2014-7-26 19:02 编辑
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[])
{
//声明报数函数
int numberOff(int n,int m);
//调用报数函数并打印叛徒编号,
printf("叛徒是NO.%d\n",numberOff(15,3));
return 0;
}
//n代表人数,m代表报数
int numberOff(int n,int m)
{
int count = n;//count代表圈子内剩余的人数
int flag=0;//当前报数
int i,j;//i表示当前报数人下标
int *a,traitor;//a表示N个人在圈子内。traitor代表最后剩下的叛徒
//开辟动态链表,将空间首地址赋值给a
a=(int*)malloc(n*sizeof(int ));
for (i=0; i<n;i++)
{
a[i]=i+1;//a[i]保存i个人的编号
}
i=0;//从编号为0的人开始报数
while (count>1)//当圈子内剩余人数大于1时执行循环
{
flag++;//开始报数
if (flag==m)//报到m得人离开
{
//将当前报道m的人删除
printf("%d号退出圈子\n",a[i]);
for (j=i; j<count-1; j++)
{
a[j]=a[j+1];//删除报到M的人,表示退出圈子
}
count--;//圈子剩余人数-1
flag=0;//报数置位,从新开始计数
i-=1;
}
i= (i+1)%count;//计算下一个报数人得下标
}
traitor = a[0];//最后剩下一个人。把值赋给traitor
return traitor;
}
复制代码
希望对你有帮助,我那会是这么做得。 你可以尝试改下主函数。。多少人 报到多少退出都可以算。这题你把它先看成数学题找找算法。
作者:
dawei233
时间:
2014-7-26 20:26
感谢楼上所有回复。我今晚再照着2楼的思路构思一下,尝试敲一遍。{:3_67:}
不行的话,再研究一下3楼。谢谢。周末愉快。~···
作者:
istream
时间:
2014-7-27 09:38
典型的约瑟夫环问题,用数组或者链表来实现,踢出去的数据置一个特定的值即可。
作者:
曹雨
时间:
2014-7-27 10:29
约瑟夫环
作者:
dawei233
时间:
2014-7-27 10:56
istream 发表于 2014-7-27 09:38
典型的约瑟夫环问题,用数组或者链表来实现,踢出去的数据置一个特定的值即可。 ...
{:3_53:}感谢,我百度了解一下看看。
作者:
jeromechen
时间:
2014-7-27 12:04
楼上几个思路不错
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2