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版