猴子选大王
//有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),//凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
给个思路,最好代码,c#的不要C语言的,c是不是用指针什么的,c#中没有,初学者,
2016-05-16 14:34

2016-05-16 15:43
程序代码:#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
2016-05-16 16:01
程序代码:#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
程序代码: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