// // main.c // 测试题 10 // 10、 耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。(C语言) // Created by black on 15/11/2. // Copyright © 2015年 black. All rights reserved. //
#include <stdio.h> int search_traitor(int arr[]);// 函数声明 void print_arr(int arr[]);//用来遍历打印数组
void print_arr(int arr[]){
for (int i=0; i<15; i++) { printf("%d",arr); } printf("\n"); }
int search_traitor(int arr[]){
//定义变量 int left = 15,count = 1,traitor = -1;
//定义算法 //十五个人依次循环,arr为0时,count++ //当count等于3时,令当前arr[]为1,且count重新置1,left-- //当left为1时,说明只剩下一个门徒,找到为0的数组元素,则该门徒即为叛徒 while (1) { for (int i=0; i<15; i++) { if (0 == arr && 3 != count) { count++; } else if (3 == count && 0 ==arr){ arr = 1; count = 1; left--; } } //判断是否剩余一人,如果是,找到该门徒 if (1 == left) { for (int i=0; i<15; i++) { if (0 == arr) { traitor = i+1; } } break; } // print_arr(arr); }
return traitor; }
int main(int argc, const char * argv[]) {
//定义门徒数组follower,门徒序号i int follower[15]={0},i; i = search_traitor(follower); printf("出卖耶稣的叛徒的序号为%d\n",i); print_arr(follower); return 0; }
|