美文网首页E_C/C++程序员数据结构
C语言经典面试题-约瑟夫环问题分析

C语言经典面试题-约瑟夫环问题分析

作者: 时间已静止 | 来源:发表于2016-04-08 19:29 被阅读2775次

好久没有看有关算法的问题了,今天废了不少劲,再感叹一句:要想学好算法就要常练习,没什么捷径可走。废话不多说,如下:

问题描述:有m个人,围成一个环,编号为 0、1、2、3、、、m-1,从第一个人开始循环报数,假设数到n的那个人出列,然后从下一个人继续数数,数到n出列,以此循环,最后那个人为胜利者,求胜利者的编号。

分析如下:
设m为人的个数 n为要数的数 k为从第几个人开始数.

第一次的数列,记为A:
0 1 2 3 4 5 6 7 8 9 、、、n%m k、、、m-2 m-1

假设第一次出列了一个人,则编号肯定为n%m-1(减1因为从零开始)。k=n%m,第一次出列后的数列为:
0 1 2 3 4 5 6 7 8 9 、、、k、、、m-2 m-1

第二次从k开始数数那么可以组成新的数列,记为数列B:
k->0
k+1->1
k+2->2
k+3->3



k-3->m-3
k-2->m-2
如果我们知道了数列B的最终胜利者是的编号是x,那么x在原来数列A中的编号是多少呢?很容易算出来:(x+k)%m,而k=n%m,替换后为(x+n%m)%m=(x+n)%m(x+n)%m为数列A的胜利者。那么x又该如何求呢,我们可以求数列C,就这样这么以次类推。直到只有一个人时,胜利者的编号肯定为0.
假设f(y)为胜利者:则有
f(1)=0;
f(2)=(f(1)+n)%2;
f(y)= (f(y-1)+n)%y; y为数列的人数,n为要数的数

以下为编程实现,将f(y)替换为number,y替换为i

/*********************************************************************** 
**m总人数,则标号为0~m-1   n为要数的数 
**成功返回序号1~m,失败返回-1 
***********************************************************************/  
int winner(int m, int n)  
{  
    int i;  
    int number;  
    if (m <= 0 || n <= 0) {  
        return -1;  
    }  
    number = 0;                        /* 当只有一个人时,编号为0的出圈 */  
    for (i = 2;i <= m;i++) {           /* 循环m-1次将剩下一个人         */  
        number = (number + n % i) % i; /* 这样写易理解,或(number+n)%i  */  
    }  
    return number + 1;                 /* 程序从0编号,返回时应+1       */  
}

相关文章

  • C语言经典面试题-约瑟夫环问题分析

    好久没有看有关算法的问题了,今天废了不少劲,再感叹一句:要想学好算法就要常练习,没什么捷径可走。废话不多说,如下:...

  • 约瑟夫环问题(c++)

    百度百科: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆...

  • 约瑟夫环问题

    约瑟夫环问题约瑟夫环描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围...

  • 约瑟夫环问题

    0~n-1个数排成环,每次从中删除第m个数字后,问最后剩下的数字是多少 思路:使用链表模拟环状结构,到达尾部时使其...

  • 约瑟夫环问题

    思路 递推,f(n)与f(n-1)的关系,已经f(1)已知,O(n)的复杂度求出结果。f(n) = (f(n-1)...

  • 约瑟夫环问题

    约瑟夫环:30个人(15个教徒和15个非教徒)坐船出海 船坏 需要把15个人扔到海里 其他人才能幸存 围成一圈从某...

  • 约瑟夫环问题

    参考文章 约瑟夫环之二(用递归的思想解决Josephus问题) 解释 解法 初始情况: 0, 1, 2 ........

  • 约瑟夫环问题

    问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编...

  • 约瑟夫环问题

    题目:一圈人围坐,以数字K位第一个个人,叫道 M 的人自动出列,请写出出列顺序 第一种方法:使用单项循环链表实现 ...

  • 约瑟夫环问题

    在刷leetCode 的时候碰到了以下问题:给定一个从1 到 n 排序的整数列表。首先,从左到右,从第一个数字开始...

网友评论

    本文标题:C语言经典面试题-约瑟夫环问题分析

    本文链接:https://www.haomeiwen.com/subject/jfivlttx.html