黑马程序员技术交流社区
标题:
耶稣门徒的问题
[打印本页]
作者:
DYKJ12
时间:
2014-7-11 11:07
标题:
耶稣门徒的问题
本帖最后由 DYKJ12 于 2014-7-17 16:38 编辑
耶稣有
13
个门徒,其中有一个是叛徒,
13
人坐一圈,从第一个开始报号:
1
,
2
,
3
,
1
,
2
,
3
⋯⋯
,凡是报到
“3”
就退出圈子,最后留下的人就是叛徒,找出它原来的序号。脑子里没有思路呀。在网上查找了一下,但是没有太懂。
#include"stdio.h"
int main()
{int a[10000]={0};
int b,c,d=0,e=0,j,s,r;
int *p;
void h(int x[]);
printf("请输入总人数:");
scanf("%d",&b);
for(c=0;c<b;c++)
a[c]=c+1;
p=a;
for(s=0;;s++)
{for(r=0,e=0;e<b;e++)
{if(*(p+e)!=0)
{j=*(p+e);
r++;
}
}
if(r==1)break;
for(c=0;c<b;c++)
{if(*(p+c)==0)continue;
d++;
if(d%3==0)
{
*(p+c)=0;
}
}
}
printf("背叛者是第%d位\n",j);
return 0;
}
作者:
追马
时间:
2014-7-11 11:21
又是你呀。这个问题你可以百度约瑟夫环。百度上有详细的解决办法。
下面代码是我写的。我觉得还是很容易懂的。已经在xcode上运行通过了。
#include <stdio.h>
int main(){
//定义flag标志,用来查数(1,2,3)
int flag = 0;
//定义out变量,用来记录离开的门徒的数量
int out = 0;
//定义一个数组,用来表示15个门徒
int person[15];
//给15个门徒从1到15排序。
for(int i=0;i<15;i++){
person[i]=i+1;
}
//定义变量i用来反复循环person数组,模拟查数(1,2,3)的顺序
int i = 0;
//当记录离席人数的out变量达到14个人时,剩下的就是叛徒。
while(out<14){
//模拟门徒查数,这里以0作为是否离席的判断条件
if(person[i]!=0){
flag++;
printf("flag = %d,",flag);
printf("person%d\n",i+1);
}
//当查到3时,该人离席,同事将他的编号赋值为0;
if(flag==3){
person[i]=0;
printf("the person%d is out\n",i+1);
//flag清空,表示要从1开始重数。
flag=0;
//离席人数加1
out++;
}
//i反复循环
i++;
if(i==15){
i=0;
}
}
//后台验证离席人数是否达到14
printf("out = %d\n",out);
//后台验证目前的数组内容情况是否和预想的一样:
//应该只剩下一个元素有编号,其他元素都为0,表示离席.
for(int i=0;i<15;i++){
printf("%d\n",person[i]);
}
//打印出最后没有离席的叛徒的编号:
for(int i=0;i<15;i++){
if(person[i] == 0){
person[i++];
}else{
printf("叛徒是:%d\n",person[i]);
}
}
//程序结束
return 0;
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2