题目的大致意思是:一些数字顺时针排成一个圈,最上面的是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]);
}
}
}