标题:猴子选大王
只看楼主
学好好要饭
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2016-5-4
结帖率:100%
已结贴  问题点数:10 回复次数:5 
猴子选大王
//有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),
 //凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

给个思路,最好代码,c#的不要C语言的,c是不是用指针什么的,c#中没有,初学者,
搜索更多相关主题的帖子: C语言 大王 最好 
2016-05-16 14:34
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
得分:1 
n个元素的数组,依次为编号1,2,3...n,退出的人置0。编号不为0的人才能报数,按数组下标顺序报数到数组末尾则下标重置为0,用for如此不断处理,直到数组中仅有一个不为0即可。

   唯实惟新 至诚致志
2016-05-16 15:43
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
得分:4 
c语言那边有人问过类似的问题,下面是我的代码。
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define M 3
#define N 5

//http://bbs.bccn.net/viewthread.php?tid=461977&page=1#pid2553583
int main()
{
    int A[M]={2,4,7},person[N]={1,2,3,4,5};  //淘汰的人的序号记为0
    int personLeft;  //淘汰后剩余的人数
    int index_A=0;   //要淘汰的报数数组下标
    int index_person=0;  //要开始报数的人的数组下标
    int luckyOne;  //标记中奖人的序号
    int i,j;

    //先输出原始的N个抽奖人
    for(i=0;i<N;i++)
    {
        printf("%d ",person[i]);
    }
    printf("\n");

    do
    {
        personLeft=0;
        j=0;
        for(i=index_person;i<N;i++)  //从index_person开始报数
        {
            if(person[i]!=0) j++;  //没有淘汰的人开始报数并统计
            if(j==A[index_A])  //当统计的报数等于要淘汰的报数
            {
                person[i]=0;  //将报此数的人淘汰
                if((N-1)==i) i=-1;  //如果此人恰好是最后一个人,i=-1,下面index_person自加1变为0,从头开始报数
                index_person=i+1;  //index_person置于被淘汰人的后一个人
                if(index_A==(M-1)) index_A=-1;  //如果要淘汰的报数是最后一个,从头开始
                index_A+=1;  //index_A置于下一个要淘汰的报数
                break;  //淘汰一个人后退出for进入下一轮
            }
            if((N-1)==i) i=-1;  //当报数到最后一个人时,仍没有匹配时,从头开始
        }

        //输出淘汰操作后的情况,并计算剩余的人数
        for(i=0;i<N;i++)
        {
            printf("%d ",person[i]);
            if(person[i]!=0)
            {
                luckyOne=person[i];
                personLeft++;
            }
        }
        printf("\n");
    }while(personLeft>1);  //只有剩余的人数等于1时,才停止操作

    printf("The lucky guy is:%d\n",luckyOne);

    return 0;
}


[此贴子已经被作者于2016-5-16 15:49编辑过]


   唯实惟新 至诚致志
2016-05-16 15:47
学好好要饭
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2016-5-4
得分:0 
回复 2楼 qq1023569223
怎么好像又是你啊,哈哈,这题解决了,我这边的代码简短一点,还有一个题目是海滩猴子分桃子,答案是对的,但是不可行,要是100只猴子怎么办,下面附上我的问题和答案



 //海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把

            //多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的

            //一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
            int i1, i2, i3, i4, i5;
            for (int i = 5; i < 1000; i++)
            {
                //最后一堆的桃子数
                if ((i * 5 + 1) % 4 == 0)
                {
                    //最后第二堆的桃子数
                    i2 = (i * 5 + 1) / 4 * 5 + 1;
                    if (i2 % 4 == 0)
                    {
                        //最后第三堆得桃子数
                        i3 = i2 / 4 * 5 + 1;
                        if (i3 % 4 == 0)
                        {
                            i4 = i3 / 4 * 5 + 1;
                            if (i4 % 4 == 0)
                            {
                                i5 = i4 / 4 * 5 + 1;
                                Console.WriteLine("最后一个拿走的桃子数是:{0}", i);
                                Console.WriteLine("桃子数为:{0}", i5);
                            }
                        }
                    }
                }
            }
            Console.Read();
2016-05-16 16:01
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
得分:1 
下面的代码你去验证一下:
程序代码:
#define N 5
int i,j,k;

for(i=4;;i++)
{
    j=1;
    k=i;
    
    while(j<N)
    {
        if((5*k)%4==0)
        {
            k=5*k/4+1;
            j++;
        }
        else
        {
            break;
        }
    }
    
    if(j==N)
    {
        printf("%d\n",k);
        break;
    }
}

   唯实惟新 至诚致志
2016-05-16 19:46
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:4 
C#(面向对象)的思路
程序代码:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        private LinkedList<Monkey> link;//链表,表示猴子按顺序排列
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Init(100);    //表示有100个猴子
            p.NumberOff(p.link.First, 1); //从第1个猴子开始,报数为1
            int i = p.link.First.Value.ID;
            Console.WriteLine("最后剩下的是" + i + "");
            Console.Read();
        }

        /// <summary>
        /// 初始化链表
        /// </summary>
        /// <param name="nums">猴子数</param>
        private void Init(int nums)
        {
            link = new LinkedList<Monkey>();
            for (int i = 1; i <= nums; i++)
            {
                Monkey monkey = new Monkey() { ID = i, Num = i };
                link.AddLast(monkey);
            }
        }

        /// <summary>
        /// 报数过程
        /// </summary>
        /// <param name="node">当前猴子</param>
        /// <param name="i">当前报数</param>
        private void NumberOff(LinkedListNode<Monkey> node, int i)
        {
            if (link.Count == 1) return;    //如果只剩一个猴子,直接返回
            LinkedListNode<Monkey> tempNode = node.Next ?? link.First;  //取当前猴子的下一个猴子,如果当前是最后一个,则下一个是第一个
            if (i == 3)//如果报数为3
            {
                link.Remove(node);//从链表中移除,表示退出圈子
                i = 1;//下一个报数从1开始
            }
            else
            {
                i++;//如果不为3,则报数+1
            }
            NumberOff(tempNode, i);//传入下一个猴子继续报数
        }
    }

    /// <summary>
    /// 猴子类
    /// </summary>
    class Monkey
    {
        public int ID { get; set; } //序号
        public int Num { get; set; }//报数号
    }
}
2016-05-18 03:28



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-464877-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.298330 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved