C语言复习---找出报数最后一人

题意:

有n个人围成一圈 顺序排号 从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

算法实现:

(一)一种是按照链表数据结构(一)线性表循环链表之约瑟夫环

(二)使用数组实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int getLast(int *p, int n)
{
    int count = 0,index=0;
    int i = 0, k = 0;
    while (count<n-1)  //一次处理一个步长,只包含if判断,会简单点
    {
        if (p[i++])
            k++;

        if (k == 3)
        {
            p[i - 1] = 0;
            count++;
            k = 0;
        }

        if (i == n)
            i = 0;
    }

    for (i = 0; i < n; i++)
        if (p[i])
            return p[i];
}

int main()
{
    int n,i;
    int* p;
    printf("input number of person:");
    scanf("%d", &n);
    p = (int*)malloc(n*sizeof(int));

    for (i = 0; i < n; i++)
        p[i] = i + 1;

    i = getLast(p, n);

    printf("%d\n", i);

    system("pause");
    return 0;
}

 

posted @ 2018-08-30 19:36  山上有风景  阅读(1173)  评论(0编辑  收藏  举报