黑马程序员技术交流社区

标题: 入学交流贴 [打印本页]

作者: 黑马公公007    时间: 2015-10-12 19:53
标题: 入学交流贴
耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。(C语言)



#include<stdio.h>
#include <stdlib.h>
//n表示最初有多少个人,m表示报数到多少的人离开,函数Joseph返回最后剩下的人的编号
int Joseph(int n,int m)
{  
    //int m=3;
    int count = n;   //count表示当前圈内剩下的人数
    int num=0;     //num表示当前报的数
    int i,j;       //i表示当前报数的人对应的下标
    int *a, remain;
    //动态申请连续的n个存储单元用来存放每个人的编号,将空间首地址赋值给a
    a = (int *)malloc(n*sizeof(int));
    for(i=0; i<n; i++)
        a = i+1; //a保存第i个人的编号
    i = 0; //从下标为0的人开始报数
    //printf("Delete In Order: ");
    while(count>1) //如果剩余人数大于1则循环
    {
         
        num++;
        if(num == m) //报数到m的人离开
        {
            //将下标为i的元素删除
            //printf("%d\t",a);
            for(j=i; j<count-1; j++)
                a[j] = a[j+1];
            count--; //当前剩余人数减1
            num = 0; //下一个人重新从1开始报数
            i-=1;         
        }
        i=(i+1)%count; //计算下一个要报数的人的下标
    }
    remain = a[0]; //最后只剩下一个人,将其编号赋值给remain
    return remain;
}
int main()
{
    int n,m;
    int i;
    printf("input n and m:n表示最初有多少个人,m表示报数到多少的人离开\n");
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        //printf("%d\n",Joseph(n));
        printf("\nRemain: NO.%d\n",Joseph(n,m));
    }
    return 0;
}

个人觉得,这个题蛮有意思的,希望大家多多支持






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