耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,
* 从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶
* 稣的叛徒,请找出它原来的序号。
*/
ps:小弟刚学c 对各位大神用的链式的高级方法不懂 自己想了个方法
#include<stdio.h>
int main() {
int MEMBER=15; //定义MEMBER开始成员个数为15
int count=1; //定义count为报数 1,2, 3 此时设为1是因为下面的判断语句是先报数再执行判断
int a[15];
int personLeft=MEMBER; //定义personLeft 为剩下成员的个数
for (int i=0;i<MEMBER;i++){ //for循环遍历从0~14 即编号为1~15的人
a[i]=1+i; //初始化数组,给每人人都编号1,2,3... 数组编号从0开始,数组中a[0]为第一个人,依次类推每个人都+1
}
for (int i=0;i<MEMBER;i++){ //for循环遍历从0~14 即编号为1~15的人
for (int j=0;j<MEMBER;j++){ //二维嵌套for循环遍历从0~14 即编号为1~15的人
if( personLeft >2){ //判断进入循环的条件为还剩余多过2个人,因为剩余2个人就不会报到3了,最终肯定剩下2个叛徒.
if(count==3 && a[j]!=0){ // count==3: count从1开始1,2,3 即报到了第三个人, a[j]:"j"代表第j+1个人的编号
// 如果他退出了则给他 编号对应的值设为0 "a[j]!=0". a[j]!=0判断这个编号的人是否
//在上一轮就已经退出了如果是则跳过他,让下一个人报数.
a[j]=0; //进入if语句则代表 a[j]报到了3,a[j]设为0,代表他已经退出.
count=1; //进入if语句则代表 有人报到了3,重新开始报数 count变为1 此时设为1是因为的判断语句是先报数再执行判断
personLeft--; //剩余人数减1
}else if(a[j]!=0){ // a[j]!=0 是代表剩下的人 (a[j]=0代表此人已经退出),开始重新报数
count++; //让下一个人报数
}
}
}
}
printf("最后剩下的叛徒的编号为:"); //打印文本
for (int j=0;j<MEMBER;j++){ //for循环遍历从0~14 即编号为1~15的人
if (a[j]!=0){ //之前退出的人a[j]已经设为0,此时如果a[j]!=0则代表剩下的人
printf("%d\t",a[j]); // 打印剩下的叛徒原来的编号
}
}
printf("\n");
return 0;
}
|