JAVA中的约瑟夫环和猴子王问题


今天在书上(书名< java程序设计经典300例 >李源编著)看了一个有趣的问题,那就是java版的约瑟夫问题,想必大一的小伙伴们早就用c写过了吧 

今天我在复习一下

首先问题是这样的n个人围成一圈 编号为1-n,从k号开始报数,当报道数字为m时 该人出局  由该人的后一个人继续从1报道  依此循环 直到留下一人 (猴王)

那么思路是这样的  首先这是一个循环问题  从N号后又得回到1号 我们可以建立一个循环单链表 (数组形式就可以)    其次就是关于如何去报数 这个比较轻松 利用一个循环从1开始加当到m时则重置为1  再有就是如何判断以经出局的编号  我们可以将数组定义为整形数组 里面的初始值全置为1  当其出局时就置为0 大概问题的难点就是如何建立循环了

 不多说

 小码农还是以代码为主

int n;//人数

int k;//从编号为k的人开始报数

int m;//报道编号为m的人出局

int n1=n+1;

int a[n1];//为了方便 我们直接从1号开始 0号位置不用

for(int i=0;i

a[i]=1;//将数组全置为1

for(int i=1;i<=m;i++){//从1到m

if(n==1)

 break;//先写上循环出口最后一个人时退出

else if(i==m){

n--;//人出局 人数减一

i=1;//重置循环变量为1重新报数

a[k]=0;//k为随初始K值递变的报数的人的编号  当实际报道m时 该人物编号k的数组内容置0表示出局

System.out.println(k+" ");//显示出局顺序

do{//每报一个人k+1,若后一个人的编号已出局 则k+至后面最近的不出局的人的编号

k++;

k=k%n1;

}while(a[k]!=1)

 //循环结束

System.out.println("最后编号为"+k);

其实看似题目简单 但对于我这种新手小白来说还是挺有难度的  

希望大家好好学习 

多练习  多操作 

可尝试c版

相关