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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 嗨灬小凯 中级黑马   /  2015-4-20 11:51  /  1411 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
耶稣有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] = i+1; //a[i]保存第i个人的编号
    i = 0; //从下标为0的人开始报数
    //printf("Delete In Order: ");
    while(count>1) //如果剩余人数大于1则循环
    {
        
        num++;
        if(num == m) //报数到m的人离开
        {
            //将下标为i的元素删除
            //printf("%d\t",a[i]);
            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;
    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;
}

9 个回复

正序浏览
x331275955 发表于 2015-4-20 14:45
while(scanf("%d%d",&n,&m)!=EOF)
麻烦问下,这里的EOF是(我百度了下,不是太明确,EOF和 '\0' 的意思是 ...

while(scanf("%d%d",&n,&m)!=EOF)返回输入的数据和格式字符串中匹配次数。
当dos或windows中输入ctrl+z(模拟文件结束符EOF)时,scanf返回EOF,
所以当输入终止符ctrl+z时,退出while循环
回复 使用道具 举报
shao 中级黑马 2015-4-20 21:09:54
9#
感觉微屌啊 。。
这个真的是基础题????
回复 使用道具 举报
基础测试都这么难啊。。。
回复 使用道具 举报
#include <stdio.h>
#define PER_NUM 15 //人数

void meth();

int main()
{       
        meth();
        return 0;
}

void meth()
{
        int ps[PER_NUM]={0,}; // 数组编号是人的编号,初始化值全为0
        int count = 15; //剩余没嫌疑的人数
        int i; //人员编号
        int temp = 0; // 临时变量存放人员该喊的数
       
        while(count > 1)
        {
                for(i = 0; i < PER_NUM; i++)
                {
                        if(ps[i] ==0 )
                        {
                                ps[i] = temp + 1;
                                temp = ps[i];       
                        }
                        if(ps[i] == 3)
                        {
                                ps[i] = -1;
                                temp = 0;
                                count--;
                                printf("第%d号没有嫌疑.\n", i);
                        }
                        if(ps[i] ==1 || ps[i] ==2)
                        {
                                ps[i] = 0;
                        }

                }
        }
        for(i = 0; i < PER_NUM; i++)
        {
                if(ps[i] != -1)
                {
                        printf("第%d号就是犹大!!!\n", i);
                }
        }
}
这样行不,想了半天
回复 使用道具 举报
额,我都还没做呢,呵呵
回复 使用道具 举报
基础测试都感觉好难:'(
回复 使用道具 举报
while(scanf("%d%d",&n,&m)!=EOF)
麻烦问下,这里的EOF是(我百度了下,不是太明确,EOF和 '\0' 的意思是一样的么?)?
回复 使用道具 举报
是的!!! 当时我有点头晕!!!
回复 使用道具 举报
这是基础测试?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马