作业帮 > 综合 > 作业

c语言:有n个人围成一圈,按顺序编号.从第1个人开始报数,数到m时该人退出,并且下一个从1重新开始报数.

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/14 10:50:52
c语言:有n个人围成一圈,按顺序编号.从第1个人开始报数,数到m时该人退出,并且下一个从1重新开始报数.
如题 要求按顺序输出退出的人的编号 这是我写的
#include "stdafx.h"
#include "stdio.h"
void delete1(int *p,int n,int x)
{
int i,k;
for(i=1;i
百度"约瑟夫问题",不过一般的都是O(n^2)的时间复杂度,如果需要O(NlgN)的时间复杂度,私信
再问: 没有学这么深 才学到指针
再答: 程序出问题,跟着调试走一遍,影响会深刻一点
再问: 大哥能帮我找下问题所在 我就是找不到才提问的
再答: #include<stdio.h>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define MAX_N 31000
int tree[MAX_N<<2],flag;
void build(int l,int r,int rt)
{
    tree[rt] = r - l + 1;
    if(l==r) return;
    int m = (l+r)>>1;
    build(lson);
    build(rson);
}
void update(int k,int l,int r,int rt)
{
    --tree[rt];
    if(l==r)
    {
        printf("%d%c",l,flag ? '\n' : ' ');
        return;
    }
    int m = (l+r)>>1;
    if(k<=tree[rt<<1])
        update(k,lson);
    else
        update(k-tree[rt<<1],rson);
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    build(1,n,1);
    for(int i=0,k=1;i!=n;++i)
    {
        k = (k+m-2)%tree[1] + 1;
        flag = i==n-1 ? 1 : 0 ;
        update(k,1,n,1);
    }
    return 0;
}
c语言:有n个人围成一圈,按顺序编号.从第1个人开始报数,数到m时该人退出,并且下一个从1重新开始报数. C语言:有n个人围成一圈,按顺序从1到n编号.从第一个人开始报数,报数3的人退出圈子 C语言 有n个人围成一圈,按顺序从1到n编号.从第一个人开始报数,报数3的人退出圈子 有n个人围成一圈,按顺序从1到n编号.从第一个人开始报数,报数3的人退出圈子,下一个人从1开始重新报数, C语言:有n人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子, 用C语言编写:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,请输出报数出列圈及最 2:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子, 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出(pascal 有N个人围成一个圈顺序编号,从第一个人开始报数(从1到M),凡报到M的人退出圈子, c语言:有n个人围成一圈,顺序排号.从第一个人开始报数(从1~3报数),报到3的人退出圈子,求退出顺序 C语言:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报 数),凡报到3的人退出圈子 问最后留下 C语言:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报 数),凡报到3的人退出圈子