猴子称大王代码java 猴子写代码

java解决猴子选大王问题

import java.util.LinkedList;

目前成都创新互联公司已为上1000+的企业提供了网站建设、域名、网站空间网站托管运营、企业网站设计、振兴网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

import java.util.List;

public class Program {

/**

* @param args

*/

public static void main(String[] args) {

int N = 5;

ListMonkey monkeys = new LinkedListMonkey();

ListMonkey newMonkeys = new LinkedListMonkey();

//初始化猴子

for(int i = 0; i 17; i++){

monkeys.add(new Monkey(i));

}

newMonkeys.addAll(monkeys);

int index = 0;

while (true)

{

if (monkeys.get(index).numberOff() == N)//报数数到N

{

monkeys.remove(index);

Monkey.n = 1;

}

index++;

if (index = monkeys.size())

index = 0;

if (monkeys.size() == 1)//猴子只剩一个

break;

}

//查找当王的猴子原来的位置

for(int i = 0; i newMonkeys.size(); i++){

if(monkeys.get(0).getID() == newMonkeys.get(i).getID()){

System.out.println(i);

break;

}

}

}

}

class Monkey{

public static int n = 1;

private int id;

public Monkey(int id){

this.id = id;

}

public int getID(){

return id;

}

public int numberOff(){

int num = n;

n++;

return num;

}

}

用C++编程 猴子选大王

#include iostream

using namespace std;

template class datatype class LinkList;

template class datatype

class Node

{

friend class LinkListdatatype;//友元类

private:

datatype data;//计猴子号

Nodedatatype *next;

};

template class datatype

class LinkList

{

public:

LinkList();

void monkey(int m); //建立有m个元素的单链表

datatype Get(int a); //取单链表中第i个结点的元素值

datatype Delete(int n); //在单链表中删除第n个结点

private:

Nodedatatype *head,*tail; //单链表的结构指针

};

template class datatype

LinkListdatatype:: LinkList( )

{head=new Nodedatatype; head-next=NULL;}

template class datatype

void LinkListdatatype::monkey(int m)

{

int i;//整型变量i,用于计数

Nodedatatype *p,*q;//声明结构指针

p=new Nodedatatype;//为p分配空间

p-data=1; //初始化p结点data域为1

p-next=NULL;//初始化p结点next域为空

head=p;//链表头指针head赋值为p

q=p; //q赋值为p

for (i=2; i=m; i++) //用循环结构构造链表

{

p=new Nodedatatype;//为p配内存空间

p-data=i; //初始化p结点data域为i,表示猴子号

q-next=p; //将p点加到链表尾部

q=p; //让指向链表尾部结点

p-next=NULL; //链表尾部为空

}

tail=q;//链表尾

tail-next=head;//链表尾部指向链表头,形成循环链表

}

template class datatype

datatype LinkListdatatype::Delete(int n)

{

Nodedatatype *p,*q;

int j=0;

q=tail; //指向循环链表尾部

cout"被删除的猴子号码依次为:"endl;

while (q!=q-next) //剩余结点数不为1,则继续循环

{

p=q-next;//p赋值给下一个相邻结点

j++;

if(j%n==0)

{

coutp-dataends;

q-next=p-next;//删除此结点

delete p;//释放空间

p=NULL;

}

else q=p;//q指向相邻的下一个结点p

}

coutendl;

head=q;//head指向结点q,q为链表中剩余的一个结点

return head-data;

}

template class datatype

datatype LinkListdatatype::Get(int a)

{

Nodedatatype *p;

int j;//计数器

p=head-next; j=1; //或p=head; j=0;

while (p ja)

{

p=p-next; //工作指针p后移

j++;

}

if (!p) throw "a值不合法";

else return p-data;

}

void main()

{

int m,n;

LinkListintmon;

cout"请输入猴子的总数:"endl;

cinm;

cout"请输入要删除猴子的所报的数:"endl;

cinn;

mon.monkey(m);

mon.Delete(n);

cout"猴王是:"mon.Get(1)"号"endl;

}

猴子选大王算法(快 得急)

我用java写了一个,也是给人帮忙啦,可以给兄台参考参考,有空的话,给你改个指针版出来

MonkeyNumber.java源程序如下:

package test;

import java.util.Scanner;

/**

* @author Administrator

*

* 有M只猴子围成一圈,每只各一个从1到M中的编号,

* 打算从中选出一个大王;经过协商,决定出选大王的规则:从第一个开始循环报数,

* 数到N的猴子出圈,最后剩下来的就是大王。

* 要求:从键盘输入M、N,编程输出猴子出列的次序并计算哪一个编号的猴子成为大王(用数组实现)。

* 要求程序完整,并且验证过,

*

*/

public class MonkeyNumber {

/**

* 出圈

* b方法描述/b:第outNo号出圈 p

* b方法流程/b:

* p

* @param monkey

* @param n

* @return outNo 出圈的索引号

*/

private static int getOut(int[] monkey,int n){

int outNo = -1;

int intValidVoters = getVotersNumber(monkey);

for(int i=0; imonkey.length; i++){

if(intValidVoters n){

if(monkey[i]==n%intValidVoters){

outNo = i+1;

monkey[i]=-1;// 去除该位置的值

System.out.print("--编号为["+outNo+"]的猴子出圈!--");

return outNo;

}

}

else if(intValidVoters n){

if(monkey[i]==(n%intValidVoters==0?intValidVoters:n%intValidVoters)){

outNo = i+1;

monkey[i]=-1;// 去除该位置的值

System.out.print("--编号为["+outNo+"]的猴子出圈!--");

return outNo;

}

}

else if(intValidVoters==n){

if(monkey[i]==n){

outNo = i+1;

monkey[i]=-1;// 去除该位置的值

System.out.print("--编号为["+outNo+"]的猴子出圈!--");

return outNo;

}

}

}

return outNo;

}

/**

* 重新初始化数组

* b方法描述/b:对输入的数组重新进行赋初值 p

* b方法流程/b:

* p

* @param monkey

* @param startPos 从startPos位置开始赋初值,startPos索引的数组,其值置为1

*/

private static void reAssign(int[] monkey, int startPos){

int count = 0;

//数组中大于等于位置startPos的有效值的个数

int behindCount = getVotersNumber(monkey, startPos);

//对号码重新初始化

for(int i=0;imonkey.length; i++){

int differenceValue = i-startPos+1;

if(monkey[i] != -1){

if(differenceValue 0){

monkey[i]= ++behindCount;

}

else if(differenceValue = 0){

monkey[i]= ++count;

}

}

}

}

/**

* b方法描述/b:取得当前有效选民数 p

* b方法流程/b:

* p

* @param monkey

* @return

*/

private static int getVotersNumber(int[] monkey){

int count = 0;

//计算目前多少个号码有效

for(int i=0;imonkey.length; i++){

if(monkey[i] != -1){

count++;

}

}

System.out.print("当前有["+count+"]只猴子参加选举!");

return count;

}

/**

* b方法描述/b:取得大于等于位置startPos的有效选民数 p

* b方法流程/b:

* p

* @param monkey

* @return

*/

private static int getVotersNumber(int[] monkey,int startPos){

int count = 0;

//计算目前多少个号码有效

for(int i=startPos;imonkey.length; i++){

if(monkey[i] != -1){

count++;

}

}

return count;

}

/**

* b方法描述/b:主程序 p

* b方法流程/b:测试

* p

* @param args

*/

public static void main(String[] args){

System.out.println("Input:M N ");

Scanner scanner = new Scanner(System.in);

String strM = scanner.next();

String strN = scanner.next();

while (strM == null || !strM.matches("[0-9]+")){

System.out.println("输入错误,您输入的第一个参数不是数字,请再次输入:");

scanner = new Scanner(System.in);

strM = scanner.next();

}

while (strN == null || !strN.matches("[0-9]+")){

System.out.println("输入错误,您输入的第二个参数不是数字,请再次输入:");

scanner = new Scanner(System.in);

strN = scanner.next();

}

int m = Integer.parseInt(strM);

int n = Integer.parseInt(strN);

System.out.println("当前有::["+m+"]只猴子"+",即将报的数是::["+n+"]");

int monkey[] = new int[m];

//赋初值

for(int i=0; im; i++){

monkey[i]=i+1;

}

for(int i=0; im-1; i++){

//出圈

int outNum = getOut(monkey,n);

int startPos = -1;

if(outNum==m){

startPos = 0;

}

else{

startPos = outNum;

}

//再次循环赋初值

reAssign(monkey,startPos);

System.out.println();

}

for(int i=0; im; i++){

if(monkey[i]!=-1){

System.out.println("Voting Success!!!编号为["+(i+1)+"]的猴子成为大王!");

}

}

}

}


本文名称:猴子称大王代码java 猴子写代码
网站网址:http://ybzwz.com/article/dohjdps.html