actanble

导航

Algorithm Gossip (26) 约瑟夫环问题

前言

This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。

提出问题

26.Algorithm Gossip: 约瑟夫问题 (Josephus Problem)

分析和解释

C语言 基础题, 一般书上都有示例

代码

#include <stdio.h>
#include <stdlib.h>
#define N 41
#define M 3
int main(void) {
	int man[N] = {0};
	int count = 1;
	int i = 0, pos = -1;
	int alive = 0;
	while(count <= N){
		do {
			pos = (pos+1)% N; // 环状处理
			if(man[pos] == 0)
				i++;
			if(i == M){ // 报数为3了
				i = 0;
				break;
				}
			} while(1);
		man[pos] = count;
		count++;
		}
	printf("\n约琴夫排列:");
	for(i = 0; i < N;i++)
		printf("%d ", man[i]);
	printf("\n\n您想要救多少人?");
	scanf("%d", &alive);
	printf("\nL表示这%d人要放的位置:\n", alive);
	for(i = 0; i < N;i++) {
		if(man[i] > alive) printf("D");
		else printf("L");
		if((i+1) % 5 == 0) printf(" ");
		}
	printf("\n");
	return 0; }

拓展和关联

后记

参考书籍

  • 《经典算法大全》
  • 维基百科

posted on 2017-04-14 20:56  白于空  阅读(101)  评论(0编辑  收藏  举报