用C#写约瑟夫环
共三种实现,第一种为顺序表,第二种用数组,第三种用单向链表。
//主程序
using System;
using System.Diagnostics;
namespace JosephRing
{
class Program
{
static void Main(string[] args)
{
Stopwatch sw1 = new Stopwatch();
Stopwatch sw2 = new Stopwatch();
Stopwatch sw3 = new Stopwatch();
Console.WriteLine("以下为使用线性表的约瑟夫环:");
sw1.Start();
Joseph_ring_origin j1 = new Joseph_ring_origin(500, 1, 51);
j1.JosephBuildAndStart();
sw1.Stop();
Console.WriteLine();
Console.WriteLine("以下为使用数组的约瑟夫环:");
sw2.Start();
Joseph_ring_optimize j2 = new Joseph_ring_optimize(500, 1, 51);
j2.JosephBuildAndStart();
sw2.Stop();
Console.WriteLine("以下为使用单向链表的约瑟夫环:");
sw3.Start();
Joseph_ring_link j3 = new Joseph_ring_link(500, 1, 59);
j3.JosephBuildAndStart();
sw3.Stop();
Console.WriteLine();
/*
时间测试涉及多线程问题,C#自动分配,故仅作参考
如需一起比较,需使用多进程
*/
Console.WriteLine();
Console.WriteLine("使用线性表的约瑟夫环耗时: " + sw1.Elapsed);
Console.WriteLine("使用数组的约瑟夫环耗时: " + sw2.Elapsed);
Console.WriteLine("使用单向链表的约瑟夫环耗时:" + sw3.Elapsed);
}
}
}
以下为三种实现方法的类
using System;
using System.Collections.Generic;
using exp3lib;
namespace JosephRing
{
class Joseph_ring_origin
{
/*
number : 参与人数
codenumber : 开始编号
step : 步数
*/
private int number;
private int codenumber;
private int step;
//构造函数,初始化数据
public Joseph_ring_origin(int number,int codenumber,int step=1)
{
this.number = number;
this.codenumber = codenumber;
this.step = step;
}
//创建列表;开始游戏
public void JosephBuildAndStart()
{
List<int> ring = new List<int>();
int countnumber;
for(int i=1;i<=number;i++)
{
ring.Add(i);
}
Show(ring);
int position = codenumber - 2;
while(number>1)
{
countnumber = 0;
while(countnumber<step)