趣味算法-约瑟夫环

约瑟夫环

方式 一: 数组取余数

数组取余数,若满足条件该元素值设为一,循环整个数组后,第二次循环时用一个变量保存遍历过切值不为一的数组元素的个数,作为判断条件。

#include <stdio.h>

// using mode compute
int calc(int n, int m, int nStart)
{
    int i = 0, k = 0i;
    int nCnt = 0;
    int* pArr = NULL;
    int pos = 0;

    pArr = (int*)malloc(n*sizeof(int));
    memset(pArr, 0, n*sizeof(int));

    if (nStart > n)
        return -1;

    pos = -1;
    while(nCnt < n-1)
    { 
        for (;;)
        {
            pos = (pos+1)%n;
            if (pArr[pos] == 0)
                i++;

            if (i == m)
            {
                i = 0;
                break;
            }
        }
        pArr[pos] = 1;
        printf("%d \n", pos+1);
        nCnt++;
    }

    for (i = 0; i < n; i++)
    {
        if (pArr[i] == 0)
            nCnt = i;
    }
    return nCnt;
}


int main()
{
    int nResult = -1;
    nResult = calc(41, 3, 0);

    printf("Result: %d\n", nResult);
    scanf("%d", nResult);
    return 0;
}


方式 二:循环链表方式

查找并删除满足条件的链表元素。



你可能感兴趣的:(趣味算法-约瑟夫环)