、有50个人围成一圈(编号1~50),从第1号的人开始从1报数,凡报到3的倍数的人(比如9)或者报到的数值中含有3的(比如:13)离开圈子,然后再数下去(比如第一圈50号报号50后,原来的1号就要接着报数为51,这样一直循环下去),直到最后只剩下一个人为止,问此人原来 的位置是多少号?。(C#语言)
在线等待!!!!!!!!!!!!急!!!!!!!!

解决方案 »

  1.   

    //记录已经出圈的人
                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());小弟只想到了这样写,但是推理下就不对了,从第二轮开始不正确了
      

  2.   

    http://wenwen.soso.com/z/q174063706.htm
      

  3.   

    http://topic.csdn.net/u/20090906/21/0e56dc96-e19f-4b20-bb04-d6d6e6a0c86a.html?49458
    http://topic.csdn.net/u/20080115/22/ab03ef9f-d785-41c3-9d83-da6cead94356.html
      

  4.   

    void FindTheLast(int[] FromArray, int count)
            {
                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);                //把剩下的元素组成德数组在此递推,从新出圈
                        }
                    }
                }
      

  5.   

    using System;
    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();
            }
        }
    }
    我做出来了!!!!!!!!!!!!!!!!!!!!!!!
      

  6.   

    int num;
            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;
                }        }