聪明的情侣算法题

酋长的女儿艾丽要出嫁了,按以往的风俗习惯,要搭个高台,台下是众多的求婚者,艾丽在台上扔束花,扔在台下谁身上,艾丽就得嫁给谁。但她担心落不到心爱的雷蒙身上。艾丽私下约雷蒙商量如何是好。雷蒙想出了一个主意……艾丽便和父亲说:“我不愿意搭台撒花,这么多人来,挤在一起乱哄哄的,没秩序。”父亲说,“不这样也可以,但结婚时要当场在人群中决定嫁给谁,不许指名,方法你自己定。”艾丽高兴的告诉主持人如何行事。婚日来临,人群拥挤,主持人叫求婚者排成一队,雷蒙在队外数了数队列共有101人,于是自己找了个合适的位置也站在队列中,主持人要大家从前往后1,2,1,2……报数,报单数的退出场外,余下的人位置不变,再重新从前往后1,2,1,2……报数,报单数的退场,如此下去最后只剩一人,艾丽便嫁给谁。大家惊奇的发现最后剩下的竟是雷蒙。请用程序回答雷蒙刚开始站在队列中的第几个位置。

以下是某前辈的代码。  (C++)

int main(){
    int pos[102];  
    int persons = 102;
    for (int i = 0; i < 102; i++)
    {
        pos[i] = i + 1;
    }
    while (persons != 1)
    {
        for (int i = 0, k = 1; k < persons; i++, k += 2)
        {  //pos[persons] 中保留剩下的人, 往前拷贝。  
            pos[i] = pos[k];
        }    
        persons /= 2;
    }
    cout<<"雷蒙的位置是:"<<pos[0]<<endl;// pos[0]  就是最后剩下的位置 也就是雷蒙的位置
}

以下是我的代码———————捂脸!(C#)

感觉自己写的实在是太菜了,要继续努力

public static void main()
        {
            int[] people = new int[103];
            for (int i = 1; i < people.Length; i++)
            {
                people[i] = i;
            }
            while (people[2] != 0)
            {
                for (int i = 1; i < people.Length; i++)
                {
                    if (i % 2 != 0)
                    {
                        people[i] = 0;
                    }
                }
                people = fill(people);
            }
            Console.WriteLine("雷蒙站在:" + people[1].ToString());
        }
        public static int[] fill(int[] OldArr)
        {
            int[] NewArr = new int[OldArr.Length];
            int now = 1;
            for (int i = 0; i < OldArr.Length; i++)
            {
                if (OldArr[i] != 0)
                {
                    NewArr[now] = OldArr[i];
                    now++;
                }
            }
            return NewArr;
        }
原文地址:https://www.cnblogs.com/shenwuyu/p/4529926.html