猴子选大王
//有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),//凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
给个思路,最好代码,c#的不要C语言的,c是不是用指针什么的,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编辑过]
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; }//报数号 } }