约瑟夫环问题(数组法)c语言实现
问题说明
这个问题是以弗拉维奥・约瑟夫斯命名的,它是1世纪的一名犹太历史学家。他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀,并以抽签的方式决定谁杀掉谁。约瑟夫斯和另外一个人是最后两个留下的人。约瑟夫斯说服了那个人,他们将向罗马军队投降,不再自杀。约瑟夫斯把他的存活归因于运气或天意,他不知道是哪一个机智的约瑟夫!
有N个编号为1~N的人围成一圈,现在每隔两个人(比如:1、4 之间隔了2、3)就将一个人淘汰出去,问最后剩下的是编号为几的人?
算法代码如下
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int people_count = 0;
int *peoples = NULL;
printf("please input people number: ");
scanf("%d", &people_count);
if (people_count < 2){
printf("can't do Joseph\n");
}
peoples = (int *)calloc(people_count, sizeof(int));
int i;
for(i = 0; i < people_count; i++){
peoples[i] = i+1;
}
i = 0;
int j = 0;
int rest = people_count;
while(rest){
if (i >= people_count){
i %= people_count;
}
if (peoples[i] == 0){
i++;
continue;
}
if (j++ % 3 ==0 && rest > 1){
printf("kill people NO. %d\n", peoples[i]);
peoples[i] = 0;
rest--;
}else if (rest==1){
printf("NO. %d is alive\n", peoples[i]);
rest--;
}
i++;
}
system("pause");
return 0;
}
您可能感兴趣的文章:
- 约瑟夫环问题(c语言数组实现)
- C语言,数组实现约瑟夫环问题(两种方法)
- C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题
- 算法导论之最大子数组问题 C语言实现
- 约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
- 约瑟夫环问题的数组实现
- 约瑟夫环问题(数组实现)
- C语言实现约瑟夫环,使用循环单链表和循环数组2种方法
- 约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
- 用C语言如何编程实现从三个数组中各抽取几个数进行组合的问题?
- 约瑟夫环问题(不带头结点单循环链表实现和数组实现)
- C语言 实现约瑟夫环 (有一个数组a[1000]存放0--1000;要求每隔二个数删掉一个数)
- 约瑟夫环的C语言数组实现
- 用c语言一位数组实现约瑟夫环
- 约瑟夫环问题的 PHP 实现--使用 PHP 数组内部指针操作函数
- 约瑟夫循环c语言实现 (<<数据结构与算法>>-王曙燕 约瑟夫环问题解答)
- 约瑟夫环问题——初步了解+数组实现
- C语言实现约瑟夫环问题
- C语言实现:约瑟夫问题(数组和单链表2种方法)
- The Second Blog -数组实现约瑟夫问题-C语言