题目的大致意思是:一些数字顺时针排成一个圈,最上面的是1,从1开始,隔一个数,移除一个数,顺时针一直移下去,直到最后剩下两个数,这两个数就是幸运数字。
例如1、2、3、4、5,开始如下图:
然后从1开始隔一个去掉一个数,如下图:
这个时候已经一轮了,但是剩余数字还大于2,所以继续去,这个时候4被去掉了,跳过数字5,就要去数字1了,如下图:
最后的Lucky Number就是3和5.
要求:
输入:一个数字n,即最大的数
输出:第一行显示各个被移除的数字,按被移除的顺序显示
第二行显示剩下的两个性欲数字。
我的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LuckyNumber { class Program { static void Main(string[] args) { int n = InputNumber(); IList<int> numberList = InitNumberList(n); numberList = RemovedNumberOperation(numberList); PrintLuckyNumber(numberList); Console.ReadLine(); } //输入数字 public static int InputNumber() { try { // ReSharper disable AssignNullToNotNullAttribute return int.Parse(Console.ReadLine()); // ReSharper restore AssignNullToNotNullAttribute } catch (Exception) { throw; } } //初始化数字列表 public static IList<int> InitNumberList(int n) { IList<int> numberList = new List<int>(); for (int i = 1; i <= n; i++) { numberList.Add(i); } return numberList; } //去掉数据操作 public static IList<int> RemovedNumberOperation(IList<int> numbers) { Boolean needRemove = false; while (true) { //将numberList所有需要去掉的数字先都赋值为0 for (int i = 0; i < numbers.Count; i++) { if (needRemove) { Console.Write(numbers[i] + " "); numbers[i] = 0; needRemove = false; } else { needRemove = true; } } //去除numberList所有的0 RemovedZeroFromNumberList(numbers); if (numbers.Count == 3) { if (needRemove) { Console.Write(numbers[0]); numbers.RemoveAt(0); } else { Console.Write(numbers[1]); numbers.RemoveAt(1); } return numbers; } if (numbers.Count == 2) return numbers; } } public static IList<int> RemovedZeroFromNumberList(IList<int> numbers) { while (true) { if (numbers.Contains(0)) numbers.Remove(0); else { return numbers; } } } //打印幸运数字 public static void PrintLuckyNumber(IList<int> numbers) { Console.WriteLine(); Console.WriteLine(numbers[0] + " " + numbers[1]); } } }