扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
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;
}
}
#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)+"]的猴子成为大王!");
}
}
}
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流