6-2 A06-指针-约瑟夫问题 (10 分)

约瑟夫问题:N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人从1开始报数,数到M的人出圈;……直到只剩1人,输出依次出圈的人的编号。

N,M由键盘输入,0 <M <= N <20

函数第一个参数设计为指针,传主函数的数组作为参数。输出时,每个数字后有且仅有一个空格。

yuesufu.jpg

例如N=7,M=2,表示7个人围坐一圈,从1号开始报数,数到2的就出列。第一轮转圈中,2、4、6号依次出列。还剩下7、1、3、5四个数字。第二圈又是数到2的数列,1和5出列。第三圈的时候,只剩下3和7列。最终的输出结果是: 2 4 6 1 5 3 7

函数接口定义:

void yuesefu(int *p,int n,int m);

指针 p 指向一个一维数组,数组的元素数量是n 个。 m 表示传入的报数的数字。

裁判测试程序样例:


#include<stdio.h>
#define L 20
//指针p指向的一维数组有n个元素,然后按照数字m进行报数出列。 
void yuesefu(int *p,int n,int m);
int  main()
{
    int a[L];
    int M,N;
    scanf("%d%d",&N,&M);
    yuesefu(a,N,M);
}

/* 请在这里填写答案 */

输入样例:

有7个人,从第一个人开始报数,数到2的出列。

7 2

结尾无空行

输出样例:

出列的顺序,注意每个数字后,有且仅有一个空格。

2 4 6 1 5 3 7 

结尾无空行

void yuesefu(int *p,int n,int m){
    int a[L];
    int i;
    int x=n;
    int count=0;
    for(i=1;i<=n;i++){
        a[i]=i;//首先给人赋值不要忘了
    }
    do{
        for(i=1;i<=n;i++){//如果不引入x的话,这里的n会变化
            
            if(a[i]!=0)  count++;
        if(count==m){
           a[i]=0;
           count=0;
           x--;
           printf("%d ",i);
        } 
        }
        
    }while(x>0); 
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值