问题:
耶稣有13个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒
思路:
1.将每个人进行原始标号,从1~13号;
2.从第一位开始报号,当你报到3的时候,你的标号清除(我们用0代表);
3.每当一个人被标记为0,相应的总人数减1;
4.以此类推,当只剩下一个人的标号没有为0,则该标号为叛徒;
示例代码:
#include <stdio.h>
#define M 13 //M门徒的人数
#define N 3 //N循环的单元
int main()
{
int man[M]={0},count=0,people=M;//count计数(1,2,3),people当前人数
printf("原始的排名:\n");
//初始化排名
for(int i=0;i<M;i++){
man[i]=i+1;
printf("%d ",man[i]);
}
//进行排除
printf("\n>>>>>>>>>开始排除>>>>>>>>\n");
while(people>1)//只要人数大于1,则继续排除
{
for(int p=0;p<M;p++){//循环排除
if(man[p]!=0){
count++;
}//如果当前位置不为零,则count+1
if(count==N){
printf("\n第%d被排除\n",man[p]);//把当前位置排除
printf("排除后的排名为:\n");
man[p]=0;//该位置清零
for(int i=0;i<M;i++){
printf("%d ",man[i]);
}//将本次排除打印出来
printf("\n");
count=0;//从新计数
people--;//人数减1
}
}
}
//将叛徒的排名打印出来
for(int i=0;i<M;i++){
if(man[i]!=0)
{
printf("\n第%d是叛徒\n",man[i]);
}//遍历排名,不为0的即是叛徒
}
}