您的位置:首页 > 编程语言 > C#

【C#学习】利用数组解决约瑟夫环问题

2013-07-25 11:15 357 查看

约瑟夫环问题即设有n个人坐成一个圈,从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人再次出列,如此反复循环,直到所有人都出列为止,最后按出列顺序输出。

话不多说,直接看代码吧。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 约瑟夫环
{
class Program
{
#region
/// <summary>
/// 约瑟夫环问题
/// </summary>
/// <param name="total">总人数</param>
/// <param name="start">开始报数的人</param>
/// <param name="alter">要出列的人</param>
/// <returns>返回一个int类型的一维数组</returns>
static int[] Jose(int total,int start,int alter) {
int j, k = 0;
//intCounts数组存储按出列顺序的数据,以当结果返回
int[] intCounts = new int[total + 1];
//intPers数组存储初始数据
int[] intPers = new int[total + 1];
//对数组intPers赋初值,第一个人序号为0,第二人为1,以此类推
for (int i = 0; i < total; i++)
{
intPers[i] = i;
}
//按出列顺序依次存于数组intCounts中
for (int i = total; i >= 2; i-- )
//i代表总人数,i--表示总人数减少
{
start = (start + alter - 1) % i;
if (start == 0)
start = i;
intCounts[k] = intPers[start];
k++;
//将数到m的人出列
for (j = start + 1; j <= i; j++)
intPers[j - 1] = intPers[j];
}
intCounts[k] = intPers[1];
//结果返回
return intCounts;
}
#endregion
static void Main(string[] args)
{
int[] intPers = Jose(12, 3, 4);
Console.WriteLine("出列顺序:");
for (int i = 0; i < intPers.Length; i++)
{
Console.Write(intPers[i] + " ");
}
Console.ReadLine();
}
}
}


Ctrl+F5输出结果:



=。=
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐