黑马程序员技术交流社区

标题: 刚才无意间浏览到一个帖子,耶稣15个门徒的基础题。 [打印本页]

作者: wxy19891017    时间: 2015-4-22 22:00
标题: 刚才无意间浏览到一个帖子,耶稣15个门徒的基础题。
乍一眼看上去感觉好像还好,动手准备试试敲敲代码,完全蒙了,这就是学习完两次视频的成果吗?有点担心面试!视频中得那点C语言基础也差得有点远啊!将来还是要继续学习C语言,虽然以后主学OC。
作者: 葛先生    时间: 2015-4-22 22:09
用递归就能解决
作者: wxy19891017    时间: 2015-4-23 09:00
葛先生 发表于 2015-4-22 22:09
用递归就能解决

看了好多的解题的思路,暂时还没看明白呢!
作者: 凌乱    时间: 2015-4-23 09:17
看明白了记不住也没法呀
作者: wxy19891017    时间: 2015-4-23 11:47
凌乱 发表于 2015-4-23 09:17
看明白了记不住也没法呀

自己不参照他人暂时敲不出来,但是大概的意思明白了点,定义一个数组存放报数人对应的序号,当报数人报到指定数的时候,将下一个人的序号赋值到当前报数人位置,从而实现将当前报到指定数的人删除,循环将后面元素依次向前挪一位,根据当前报数人位置再次进入下一次循环。说的有点乱,反正就是用数组、while、for循环就能实现,当然也是参考人家的代码才明白的!
作者: wxy19891017    时间: 2015-4-23 11:49
#import <Foundation/Foundation.h>

//n表示最初多少人,m表示报出指定的数离开,函数返回最后的人的编号
int Joseph(int n,int m);

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
   
        int remain = Joseph(15, 3);
        
        printf("%d\n",remain);
   
   
    }
    return 0;
}

int Joseph(int n,int m)
{
   
    int count = n;//当前剩余的人数
    int num = 0;//当前报的数
    int a[15] = {0};//存放每个人的编号,初始化全为0
    int i,j;//i表示当前报数的人对应的下标
   
    for (i=0; i<n; i++)
        a[i] = i + 1;//a[i]保存第i个人的编号
   
    i = 0;//从下标为0的人开始报数
   
    while (count>1)
    {
        num++;
        if (num == m)
        {
            //将下标为i的人删除
            for (j=i; j<count-1; j++)
                a[j] = a[j+1];
            count--;//当前剩余的人数减1
            num = 0;//下一个人重新从1开始报数
            i -= 1;//当前人的下标减1
        }
        
        i = (i+1)%count;//计算下一个要报数的人的下标
    }
   
    return a[0];//剩余最后一个人的编号
}

作者: 葛先生    时间: 2015-4-23 14:46
wxy19891017 发表于 2015-4-23 11:47
自己不参照他人暂时敲不出来,但是大概的意思明白了点,定义一个数组存放报数人对应的序号,当报数人报到 ...

报到3把后面的值赋值前一位并删除此位的好像不行吧,因为C语言数组创建后好像不能删除了。你可以把报到3的赋值为0,定义两个常量a,b,a记录报数 1  2 3,当遍历时元素值不为0时报数才++,,到3就把这个常量赋值为0。常量b是初始值为15,报到3就- -。作用是记录剩余多少值不为0的人。还有一点就是递归调用的问题。那就是判断当报数到最后一名不为零的数时,再次调用方法进行报数。但是这里你得注意如果这最后一个 人报数是1或者2时,a继续++,所以a不应该定义在递归函数内,应该定义在main函数内
作者: wxy19891017    时间: 2015-4-23 15:17
葛先生 发表于 2015-4-23 14:46
报到3把后面的值赋值前一位并删除此位的好像不行吧,因为C语言数组创建后好像不能删除了。你可以把报到3 ...

你说的这个我不是很明白。至于你说的删除,只是将后面一位的元素赋值到前一位的位置,我记得视频中,利用数组创建字符串的时候,好像是字符串变量吧,而以指针那种形式创建的字符串是字符串常量不能增删。你看下我上面敲的代码,运行起来没问题的。
作者: 凌乱    时间: 2015-4-23 18:17
我表示看都看不懂。
作者: wxy19891017    时间: 2015-4-24 07:54
凌乱 发表于 2015-4-23 18:17
我表示看都看不懂。

我也是看了挺长时间才明白人家的代码什么意思的。




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