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;
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



猜您在找 C语言 约瑟夫圈问题:N个人围成一圈,从第一个人开始按顺序报数并编号1,2,3,……N,然后开始从第一个人转圈报数,凡是报到3的退出圈子。则剩下的最后一个人编号是多少。 C语言复习---找出一个二维数组的鞍点 有10个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是第几号的人 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM