、有50个人围成一圈(编号1~50),从第1号的人开始从1报数,凡报到3的倍数的人(比如9)或者报到的数值中含有3的(比如:13)离开圈子,然后再数下去(比如第一圈50号报号50后,原来的1号就要接着报数为51,这样一直循环下去),直到最后只剩下一个人为止,问此人原来 的位置是多少号?。(C#语言)
在线等待!!!!!!!!!!!!急!!!!!!!!
在线等待!!!!!!!!!!!!急!!!!!!!!
调试欢乐多
List<int> list = new List<int>();
int i = 1;
int pos = 0;
while (list.Count < 50)
{
//判断被三整除和包含三
if (i % 3 == 0 || i.ToString().Contains("3"))
{
pos = i % 50;
if (pos == 0)
pos = 50;
if (!list.Contains(pos))
{
Debug.WriteLine(i + " \t\t " + pos + "号开始出圈。");
list.Add(pos);
}
}
i++;
}
MessageBox.Show(pos.ToString());小弟只想到了这样写,但是推理下就不对了,从第二轮开始不正确了
http://topic.csdn.net/u/20080115/22/ab03ef9f-d785-41c3-9d83-da6cead94356.html
{
int count = FromArray.Length - 1; if (count == 1) //如果数组的长度为1,即剩下最后一个,则输出结果
{
Console.WriteLine("最后剩下的这个数位:{0}", FromArray[0]);
}
else //否则继续判断
{
for (int i = 1; i <= FromArray.Length - 1; i++)
{
if (i % 3 == 0 || i / 10 == 3 || i / 20 == 3 || i / 30 == 3 || i / 40 == 3) //凡报到3的倍数的人(比如9)或者报到的数值中含有3的(比如:13)离开圈子
{
count--; //新的数字元素个数减1
}
else
{
int ReMainArray = new int[count]; //如果不出圈,则保存到一个新的数组里,此数组的个数总数为未出圈的个数
for (int j = 0; j < count; j++)
{
ReMainArray[j] = i;
}
FindTheLast(ReMainArray, count); //把剩下的元素组成德数组在此递推,从新出圈
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int>();
//n=50
for (int i = 1; i <= 50; i++)
{
list.Add(i);
}
int index = 1;
int under = 0;
while (list.Count > 1)
{
Console.WriteLine(string.Format("{0}喊了{1}", list[under], index));
if (index % 3 == 0 || index.ToString().Contains("3"))
{
Console.WriteLine(string.Format("{0}被弹出", list[under]));
//Console.Read();
list.RemoveAt(under);
under--;
//index = 0;
}
if (under == list.Count - 1)
under = -1;
index++;
under++; } if (list.Count == 1)
Console.WriteLine(string.Format("最后一个人原来的编号为{0}", list[under]));
Console.Read();
}
}
}
我做出来了!!!!!!!!!!!!!!!!!!!!!!!
int FindTheLast(int[] FromArray, int count)
{
num = FromArray.Length;
int result;
if (num == 1) //如果数组的长度为1,即剩下最后一个,则输出结果
{
result = FromArray[0];
return result;
}
else //否则继续判断
{
for (int i = 0; i <= FromArray.Length-1; i++)
{
if (FromArray[i] % 3 == 0 || FromArray[i] / 10 == 3 || FromArray[i] / 20 == 3 || FromArray[i] / 30 == 3 || FromArray[i] / 40 == 3) //凡报到3的倍数的人(比如9)或者报到的数值中含有3的(比如:13)离开圈子
{
num -= 1; //新的数字元素个数减1
}
else
{
int[] ReMainArray = new int[num]; //如果不出圈,则保存到一个新的数组里,此数组的个数总数为未出圈的个数
for (int j = 0; j < num; j++)
{
ReMainArray[j] = FromArray[i];
}
FindTheLast(ReMainArray, num); //把剩下的元素组成德数组在此递推,从新出圈
}
}
return 0;
} }