黑马程序员技术交流社区
标题:
这个题怎么解(答案以提交,这个题没做)
[打印本页]
作者:
ios_fce
时间:
2014-4-24 22:19
标题:
这个题怎么解(答案以提交,这个题没做)
:'(耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。(C语言)
作者:
jiangenhao
时间:
2014-4-24 22:43
本帖最后由 jiangenhao 于 2014-4-24 22:54 编辑
int people[15];
int pos, peopleNum = 15, step = 0;//peopleNum记录还剩下的人数
for (int i = 1; i <=15; i++)
{
people[i-1] = i;
}
pos = 0;
while(peopleNum != 1)
{
if (people[pos])
{
step++;//不是零,就报数
}
printf("%d\n",people[pos]);
if (people[pos] && step == 3)
{
people[pos] = 0;//当报数到3的时候,就把这个元素置成0
peopleNum--;//走一个人,减一次
}
pos++;
if (pos == 15)
{
pos = 0;//为了转圈下去
}
if (step == 3)
{
step = 0;//为了报数的重新计算
}
}
for (int i = 0; i < 15; i++)
{
printf("%d\n",people[i]);
}
复制代码
把人删除比较费劲,所以我们把出局的人标记成0
关键在于数到15后 要重新接到1
数到3要接着数1把这两点想清楚就简单多了
希望能帮到你
作者:
jiangenhao
时间:
2014-4-24 23:00
jiangenhao 发表于 2014-4-24 22:43
把人删除比较费劲,所以我们把出局的人标记成0
关键在于数到15后 要重新接到1
数到3要接着数1把这两点想清 ...
我发之前明明改了 怎么没改过来呢 寝室的网速不好 现在改过了 谢谢提醒
作者:
一只小菜鸟
时间:
2014-4-24 23:38
本帖最后由 一只小菜鸟 于 2014-4-24 23:44 编辑
//耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。
void betry(int arr[1000],int len){
int arrOut[15];
int i=0;
int j=0;
int k=15;
while (len) {
i++;
if (i%3 == 0) {
arrOut[j] = arr[i-1];
j++;
len--;
}
else {
arr[k]=arr[i-1];
k++;
}
}
for (int i=0; i<15 ;i++) {
printf("%d ",arrOut[i]);
}
}
int main() {
int arr[15];
for (int i=0; i<15; i++) {
arr[i] = i+1;
}
int len = sizeof(arr)/sizeof(int);
betry(arr,len);
return 0;
}
复制代码
作者:
.Drenched
时间:
2014-4-25 18:58
我也不会做。
作者:
李鹏-ios
时间:
2014-4-26 23:02
这是我的答案,关键代码都做了注释
int main(int argc, const char * argv[])
{
@autoreleasepool {
//10、 耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。(C语言)
int students[15];
int i=0,m=0,n=15;
for (int j=0; j<15; j++) {
students[j]=j+1; //每个人的初始编号
}
while (n!=1) { //剩下最后的一个就是叛徒
if (students[i]!=0) { //一直循环,当遇见值被3整出的就将其值a[i]设为0;
m++; //m是留在圈内的人从0开始延续的编号。
if (m%3==0) {
students[i]=0;
n--;
}
}
i=(i+1)%15; //得到初始的序号
}
for (i=0; i<15; i++) {
if (students[i]!=0) { //最后数组中不为0的那个就是叛徒
printf("叛徒原来的序号是:%d\n",i+1);
}
}
// insert code here...
//NSLog(@"Hello, World!");
}
return 0;
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2