黑马程序员技术交流社区
标题:
一道C语言经典题目,会的,请给出解题思路,并附上代码....
[打印本页]
作者:
YKS
时间:
2014-7-13 17:51
标题:
一道C语言经典题目,会的,请给出解题思路,并附上代码....
耶稣有13个门徒,其中一个就是出卖耶稣的叛徒,请用排除法找出这个叛徒:13人围坐一圈,从第一个开始报号:1,2,3,1,2,3......,凡是报道”3“
就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。
有会的,请给点解题思路,谢谢了。
作者:
温天恩
时间:
2014-7-13 23:14
#import <stdio.h>
// 定义主函数,作为程序入口
int main()
{
// 代表叛徒的序号
int left;
// 代表已退出圈子的门徒数
int out = 0;
// 代表总门徒数目
int n = 13;
// 代表报数数值
int flag = 0;
// 用数组a存放所有门徒,并赋值为0,表示全在圈子
int a[13] = {0};
// 打印提示门徒的出圈顺序
printf("13个门徒依次退出圈子的顺序是:\n");
// 当还有门徒未出圈时,执行循环
while(out<n)
{
// 设置i值作为for循环参数
int i;
/***********利用for循环使门徒报数,并把已退出圈子的门徒设置状态值为1**********/
// 当未到最后一个门徒时,i++,执行循环体
for(i=0;i<n;i++)
{
// 如果未出圈,则报数
if(a[i] == 0)
{
// 报数
flag++;
}
// 如果报数为3,执行以下语句
if(flag == 3)
{
// 将状态位置为1
a[i] = 1;
// 已退出圈子的人数加1
out++;
// 将报数置0,用于下一个门徒报数
flag = 0;
// 输出现在报数门徒的序号
printf("%d,",i+1);
// 最后一次循环时,最后一个门徒即为叛徒,将其序号赋值给left,记录叛徒序号
left = i+1;
}
// 判断本圈报数是否结束
if(i == n)
{
// 如果本圈报数结束,将i置0,进入下一圈报数
i=0;
}
}
}
// 输出叛徒序号
printf("\n叛徒是%d\n",left);
// 返回0,退出主函数
return 0;
}
复制代码
解题思路
作者:
可心来了
时间:
2014-7-14 00:25
楼上给力啊 好像很厉害的样子
作者:
YKS
时间:
2014-7-14 01:40
温天恩 发表于 2014-7-13 23:14
解题思路
有点看不懂 ,浆糊了
作者:
YKS
时间:
2014-7-14 19:23
温天恩 发表于 2014-7-13 23:14
解题思路
看到了谢谢 啊 ,好厉害
作者:
温天恩
时间:
2014-7-14 20:09
YKS 发表于 2014-7-14 19:23
看到了谢谢 啊 ,好厉害
不客气,大家共同提高。
作者:
云霄之上
时间:
2014-7-15 01:20
#include(stdio.h)
int test2(test3[])//返回还没有被变成0的成员编码的数量
{int m;
int o;
for(m=0;m<15;m++)
{if (test3[m]!=0)
o++;
return o;
}
}
int test(test1[])//返回还没有被变成0的那个成员的编码
{int l;
int n;
for(l=0;l<15;l++)
{if(test1(l)!=0)
return test1[l];
}
}
int main{
int name[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i;
int j;
while(test2(name[])!=1)//当编码不为0的数量为1的时候
{for(i=0;i<15;i++)//循环让编码数数到3时变为0
{if(name[i]!=0)
{j++;
if(j=3)
{name[i]=0;
J=0;
}
}
printf(“叛徒是%d/n”,test1(name[]));
return 0;
}
初略写了一下
作者:
小海
时间:
2014-7-15 17:25
是不是每个人基础测试题里都会有这道题啊
作者:
此生逍遥
时间:
2014-7-15 22:15
貌似很简单,却有无从下手
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2