耶稣13个门徒,围成一圈,从1开始报数,报数编号1-3,当谁报到3,谁就退出,叛徒就在继续报数的人里面,找出最后一个退出的人,他就是叛徒。
求解:
思路:
13个人按顺序报数,报道3的人进行标记,下次继续进行13次循环,报数之前判断标记为,如果标记为为真就继续执行,否则就跳过,下一个人接着报数。
定义一个13个大小的数组,用来标记,看那一个是最后标记的。
代码实现:
void jesusApostles()
{
int length = 13;
int j = 0;
int data[13] = {0};
int traitor = 0;
while ((isFinished(data,length)) == 0) {
for (int i = 0; i < length; i ++) {
if (data[i] == 100) {
continue;
}
data[i] = (j % 3) + 1;
if (data[i] == 3) {
data[i] = 100;
traitor = i;
}
j ++;
}
}
printf("traitor: %d\n",traitor + 1);
}
int isFinished(int *data,int length)
{
int flag = 1;
for (int i = 0; i < length; i++) {
if (data[i] != 100) {
flag = 0;
}
}
return flag;
}