约瑟夫环 习题8-4 报数问题

 

#include <stdio.h>
#include <stdlib.h>
#define MAXN 20

void CountOff( int n, int m, int out[] );

int main()
{
    int out[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    CountOff( n, m, out );   
    for ( i = 0; i < n; i++ )
        printf("%d ", out[i]);
    printf("\n");

    return 0;
}
void CountOff( int n, int m, int out[] )
{                                 	//        约瑟夫环问题
	int i, j = 0, p = 0;            //1.首先要有一个数组当人的编号;
	int num[MAXN];                  //2.i,j,p,分别是 数组num下标,被排除的次序 
	                                //和计次m
	for (i = 0; i < n; i++) {       //3.先正常循环一次
	  num[i] = i + 1;               //4.在正常循环一次······
	}                               //5.每次循环没被排除的人,p++,
	i = 0;                          //6.当p == m 时,++j同时out数组读取排除次数j
	while (j < n) {                 //把被排除的数组num改成的值 -1
	  if (num[i] > 0) {             //7.如果 i 走到 n,i就要等于0,因为 数组num
	    p++;                        //要重新数了
	  }                             //8.循环完一次 i++;
	  if (p == m) {                 //       
	    out[i] = ++j;               //
	    num[i] = -1;                //
	    p = 0;                      //
	  }                             //
	  if (++i == n) {               //
	    i = 0;                      //
	  }                             //
	}                               //
}                                 	//

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值