黑马程序员技术交流社区

标题: 利用基础知识解耶稣问题 (有超详细的注释)之前不大明白的同学可以看一下 大神略过 [打印本页]

作者: fenxite    时间: 2015-11-3 18:00
标题: 利用基础知识解耶稣问题 (有超详细的注释)之前不大明白的同学可以看一下 大神略过

耶稣有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;
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2