约瑟夫环问题讲解
2017-08-20 18:28
113 查看
前文:
这道题基本是大家在学习C语言路上都会碰到的一道经典例题,而且对于初学c语言者来说是一道难度不小的题,其实这道题是让我们学会标记法和如何将数组变为环状。正文:
我们来看问题,说有N个人围成圈,然后将它们标号从0-num,从0开始报数报到n数的人就会被杀死,然后紧接着这个死掉人的后面从0又开始报数,报到n的人同样还是被杀死,问到最后活着的那个人是原来标号为多少的。首先我们可以把活着的人做一个标记,然后定义一个count来记录还活着的人,用一个tmp来记录他们所报的数。
下面是代码:
/*约瑟夫环 int Yuesefu(int num, int n) { assert(num != 0 && n != 0); int *arr = (int *)malloc(num * sizeof(int)); //建立动态数组 来标记所有人 assert(arr != NULL); int i=0; for (i = 0; i < num; i++) { arr[i] = 1; //先将所有人标记为1代表活着 } int count = num; //意味还有多少个人活着 int tmp = 0; //这些人报的数 while (count > 1) //直到只剩下一人,游戏一直继续 { if (arr[i]==1) //只有活着的人才能继续游戏 { tmp++; //活的人开始报数 if (tmp == n) { arr[i] = 0; //报数是n的人 死亡 tmp = 0; // 剩余的人紧接着又继续一轮从0开始报数 count--; //死了一个人,活着的人减少一个。 } } i = (i + 1) % num; //将数组变成是一个环形. } for (i = 0; i < num; i++) { if (arr[i]) //找到最后活着的人在原来哪个位置 { break; } } free(arr); //防止内存泄漏 return i; }
相关文章推荐
- 约瑟夫环的问题数学讲解
- 约瑟夫环问题
- 约瑟夫环问题
- 用个循环链表解决约瑟夫环问题
- java-约瑟夫环问题
- C语言,数组实现约瑟夫环问题(两种方法)
- 约瑟夫环问题(O(n)解法)
- 讲解Oracle面试过程中常见的二十个问题
- 约瑟夫环 poj 3750 小孩报数问题 模拟
- 约瑟夫环问题
- 约瑟夫环的问题与应用(JAVA)
- C语言基于循环链表解决约瑟夫环问题的方法示例
- Hadoop1.2.1详细配置与相关问题讲解
- 约瑟夫环问题
- 约瑟夫环问题
- 自己实现集合框架(五):利用单链表解决约瑟夫环问题
- Web---字节输出流和字符输出流的共存问题、转发、重定向、请求包含知识点讲解
- 约瑟夫环 猴子选大王的问题
- 约瑟夫环问题简单练习
- 背包基础问题讲解