约瑟夫环问题
2017-06-27 02:24
134 查看
假设又m个人围成一圈,从第n个人开始报数m个,报到m的人出圈,输出每个人的出圈顺序。
由于数组不能像List一样随意删除里面的元素,所以将已经出圈的人放到数组的后边,并且下次遍历时数组的长度减1。
数组中的第一个人必然是最后一个出圈的,当外层for循环完成时,将最后一个人添加进outPut数组中。
输出结果:
Tip:如果要删除数组中的元素的话,可以将其转换为List,删除元素后在转换成数组
class Program { static void Main(string[] args) { Program p = new Program(); p.Print(9,2,5); } //allNum 总人数 startNum 开始数的位置 num 步长 public void Print(int allNum,int startNum,int num) { int temp = 0; //声明一个存放跳出来的人的数组 int[] outPut = new int[allNum]; //声明一个数组存放出圈的人以打印出圈顺序 int[] arr = new int[allNum + 1]; //添加人allNum个 for (int i = 1; i <= allNum; i++) { arr[i] = i; } //遍历找到出圈的人,并将其放到数组的后边 for (int i = allNum; i > 1; i--) { startNum = (startNum + num - 1) % i; if (startNum == 0) startNum = allNum; outPut[temp] = arr[startNum]; temp++; for (int j = startNum; j < i; j++) { arr[j] = arr[j + 1]; } outPut[temp] = arr[1]; } for (int i = 0; i < allNum; i++) { Console.WriteLine("我是第" + outPut[i] + "个人,我是第" + (i + 1) + "个出圈的"); } } }主要逻辑在于找到出圈的人以及对出圈的人在原数组中的处理。
由于数组不能像List一样随意删除里面的元素,所以将已经出圈的人放到数组的后边,并且下次遍历时数组的长度减1。
outPut[temp] = arr[1];
数组中的第一个人必然是最后一个出圈的,当外层for循环完成时,将最后一个人添加进outPut数组中。
输出结果:
Tip:如果要删除数组中的元素的话,可以将其转换为List,删除元素后在转换成数组
int[] arry = new int[3] { 1,2,3}; ArrayList al = new ArrayList(arr); al.RemoveAt(1); arr = (int[])al.ToArray(typeof(int)); Debug.Log(arr.Length);
相关文章推荐
- 约瑟夫环问题的C版本答案
- 约瑟夫环问题的程序
- 一个Java面试题(约瑟夫环问题)
- 约瑟夫环问题
- 约瑟夫环:每隔两个循环删除数组元素,求最后删除者的下标问题
- 求解约瑟夫环问题
- 分别用 数组和链表处理约瑟夫环问题
- [算法解决]约瑟夫环问题 Josephus
- 用个循环链表解决约瑟夫环问题
- 约瑟夫环问题的程序
- 约瑟夫环问题(Josephus)
- 约瑟夫环问题
- C/C++面试之算法系列--约瑟夫环:每隔两个循环删除数组元素,求最后删除者的下标问题
- 约瑟夫环问题--java
- [c#算法和数据结构]约瑟夫环问题
- 关于约瑟夫环的问题 的通解
- 约瑟夫环问题单循环链表解法
- 一个Java面试题(约瑟夫环问题)
- 约瑟夫环问题(Josephus Problem)C程序实现
- 约瑟夫环问题