约瑟夫问题
2016-07-29 00:00
351 查看
原题
N个人围成一个圆圈,首先第一个人从1开始一个人一个人顺时针报数,报道第m个人,令其出列。然后再从下一个人开始,从1顺时针报数,报到第m个人,再令其出列,…如此下去,直到圈中只剩下一个人为止。此人即为优胜者。写一个函数求N个人中的胜者。我的思路
可以使用一数组,来存放标记为1,2,3,…,N的N个人,每当有人出列,对应数组元素置为0,下次报数遇到置0的数组元素直接跳过。实现代码
/************************************************************************* > File Name: testmain.c > Author: KrisChou > Mail:zhoujx0219@163.com > Created Time: Sun 17 Aug 2014 10:50:53 PM CST ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> int find(int *arr,int m, int n); int main(int argc, char *argv[]) { int M,N; int *arr; int index; printf("please input M and N: "); fflush(stdout); scanf("%d%d",&M,&N); /* 动态分配数组,存放N个人 */ arr = (int*)calloc(N,sizeof(int)); for(index = 0; index < N; index++) { arr[index] = index + 1; } /* 返回胜者 */ printf("winner : %d\n",find(arr,M,N)); free(arr); arr = NULL; return 0; } int find(int *arr,int m, int n) { int len = n; int index; //数组下标 int step; //报数索引 index = step = 0; while(len > 1) { if(arr[index] != 0) { ++step; if(step == m) { arr[index] = 0; step = 0; len--; } } index = (index + 1) % n; } /* 寻找出已经存在的winner,并返回 */ for(index = 0;index < n; index++) { if(arr[index] != 0) { return arr[index]; } } }
相关文章推荐
- Linux内存管理(2):内存描述
- 版本控制工具Git
- rand_1tom 产生 rand_1ton
- [算法专题] LinkedList
- [LintCode] Permutations
- Linux多线程之同步3
- HDFS架构
- 有名管道_2
- Linux进程管理(3):总结
- Linux多线程之同步
- Aggregate类型以及值初始化
- Linux系统管理实践(4):忘记登录密码或账号
- Cpp多重继承会产生的问题
- [LeetCode 3] Longest Substring Without Repeating Characters
- 百度面试题——top K算法
- 非递归方法的堆排序实现
- DFS遍历中forward、backward以及cross边的界定
- Python线程指南
- [LeetCode] Search in Rotated Sorted Array II
- Dynamic Programming | Set 1 (Overlapping Subproblems Property)