首页 > 其他 > 详细

约瑟夫环

时间:2014-04-04 02:40:57      阅读:469      评论:0      收藏:0      [点我收藏+]

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。


分析:有n个人,要想所有的人都退出去,只有每个人喊到m,才可以退完,所以可以算出,n*m为所有人总共报数的总次数。

代码:

/*
 *      约瑟夫出圈
 */
#include <stdio.h>

int main()
{
    char peo[100] ;
    char *p_peo = peo;
    int i , n , skip , flag[100] = {0} , cnt;
    int *p_flag = NULL;
    printf("请输入人数:");
    scanf("%d", &n);
    printf("所有人如下:\n");
    for(p_peo , i = 0 ; p_peo < peo + n ; ++p_peo , ++i)
    {
        *p_peo = ‘a‘ + i;
        printf("%c ", *p_peo);
    }
    printf("\n");

    printf("请输入报数值:");
    scanf("%d", &skip);

    cnt = 0;
    while(cnt <= n * skip)
    {
        for(p_peo = peo , p_flag = flag ; p_peo < peo + n ; ++p_peo , ++p_flag)
        {
            if(*p_flag)
                continue;

            cnt++;
            if(!(cnt % skip))
            {
                *p_flag = 1;
                printf("%c ", *p_peo);
            }
        }
    }
    printf("\n");
    return 0;
}


约瑟夫环,布布扣,bubuko.com

约瑟夫环

原文:http://blog.csdn.net/q_l_s/article/details/22893975

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!