A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 红龙果 中级黑马   /  2015-11-19 19:31  /  1536 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 红龙果 于 2015-11-19 19:42 编辑

题:耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。

实现思路:1、定义一个长度为15的整形数组,数组元素值为1。
                    2、定义一个计数用的变量,count;剩下人的个数len;
                3、循环遍历数组,当碰到数组元素值为1时,执行count++,然后判断count的值,count=3时,将数组元素的值置为0,count置为0;
                当len=1时,退出循环。剩下的一个人就是叛徒了。

代码:
#include <stdio.h>
#include<stdlib.h>
int main(int argc, const char * argv[]) {
    printf("请输入人数:\n");
    int num;
    scanf("%d",&num);//接收数组元素个数
    int *pt=(int *)malloc(sizeof(int)*num);//动态申请一块大小为(int类型数据所占字节数)*(数组元素个数)的内存空间,用来存储数组元素
    //c99之后的编译器支持以下的动态数组定义方式:int arry[num];
    //而int *pt=(int *)malloc(sizeof(int)*num);可以在程序运行时分配内存,并可在运行时选择数组大小;在c99之前的编译器中都支持
   
//申请分配内存失败,退出程序
    if (pt==NULL) {
        printf("memory allocation failed!\n");
        exit(EXIT_FAILURE);
    }

//对数组进行初始化,遍历元素,赋值为1
    for (int i=0; i<num; i++) {
        pt[i]=1;
    }
   
    int getLocation(int *arr,int len);//函数原型
    int value=  getLocation(pt,num);//调用函数,返回叛徒所在位置
    printf("%d\n",value);//打印输出
    free(pt);//释放内存
    return 0;
}

int getLocation(int *arr,int len)
{
    int location=0;//定义叛徒所在位置的变量
    int count=0;计数器,用来数1,2,3,1,2,3
    int personNum=len;剩余门徒个数

//圈子中门徒数等于1时退出循环
    while (personNum>1) {
//遍历数组
        for (int i=0; i<len; i++) {
//arr[i]==1代表未退出圈子的门徒;
            if (arr[i]==1) {
                count++;//计数器加1
                //碰到数到3的门徒,则将元素值置为0;0代表退出圈子的门徒,1代表未退出圈子的门徒
                if (count==3) {
                    arr[i]=0;
                    personNum--;//圈子中的门徒总数减一
                    count=0;//重新计数
                }
            }
        }
    }
   
//遍历获取值为1的元素的下标,也就是叛徒的位置
    for (int i=0; i<len; i++) {
        if (arr[i]) {
            location=i;
        }
    }

    return location+1;//返回叛徒的位置
}

程序运行结果:15个门徒的情况。第五个人时叛徒。

请输入人数:
15
5
Program ended with exit code: 0

3个门徒的情况。第2个人时叛徒
请输入人数:
3
2

Program ended with exit code: 0

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马