C#解决约瑟夫问题简单有效方法(原创)

  问题原型:

       有一堆小孩N个,围成一圈,从第s个数起,每隔m个让其离开,求离开的号数或最后离开的号数。

      注意,数人时是从离开的那个后一人数起。

上代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace 学生团团坐
{
class Program
{
static void Main(string[] args)
{
while (true)
{


Console.WriteLine("请输入学生的人数,开始序号,隔的人数");
int n = Convert.ToInt16(Console.ReadLine());
int s = Convert.ToInt16(Console.ReadLine());
ArrayList list = new ArrayList();
int m = Convert.ToInt16(Console.ReadLine());
for (int i = 0; i < n; i++)
{
list.Add(i + 1);
}
int t;
s--;
for (int i = n - 1; i > 0; i--)     //操作数组下标
{
t = s + m - 1;
s = t % i;
if (s == 0)
s = i;
if (t > i)
{
s--;
}
Console.Write(list[s] + " ");

list.RemoveAt(s);
}
Console.Write(list[0]);
Console.WriteLine();
}
}
}
}

 

 

这个代码是想挺久才想出来的,原先是老师上课讲这个题目,不过是用链表做的,并且是从离开的那个小孩算起的。

我原来以为这个问题挺简单的,可是实际操作时却发现其中还是有些难度的,好吧,我承认,我不是天才,但我能以自己的方法做出我还是挺高兴的。

这个问题主要是数组方面的,确实可以说是经典。这个只有真正自己做过的人才知道。

其实解法还可以简化,就是用数组的实际操作来替代ArryListd的类。

 

   

posted @ 2012-04-05 21:55  王之  阅读(1147)  评论(0编辑  收藏  举报