package ysfh;
创新互联是一家专注于网站设计、做网站和成都服务器托管的网络公司,有着丰富的建站经验和案例。
/**
* 【约瑟夫环的问题】
* 有17个人(编号从1到16),按编号依次排列成一个圆环(编号16的接着编号为1 的人),从编号为1 的人开始报数,数到3的人退出圆环,如此循环,最后留下的那个人的编号是什么?
* 1,2,3,4,5,6,7,8,,9,10,11,12,13,14,15,16
* 要求:请用面向对象的思想来处理这个问题并在下面写出具体的代码(可以选择你熟悉的语言,如java/C++/C#等)
* @author Administrator
*
*/
public class Ysfh {
public static void main(String[] args) {
m(3,16);
}
public static void m(int m,int n){
int c = 1;
int[] ns = ntoarray(n);
while(isone(ns) == false){//如果数组中有一个以上的数不为0
for (int i = 0; i ns.length; i++) {
if(ns[i] != 0 ){//等于0的都退出了 所以从所有不等于0的开始
if(c == m){//是第三个数 给他赋值0 并让计数器c从1 开始
ns[i] = 0 ;
c = 1;
}else{//否则继续计数器下一个
c++;
}
}
}
}
//循环输出最后留下的数字
for (int i = 0; i ns.length; i++) {
if(ns[i] != 0){//除0以外的数字 0代表删除
System.out.println(ns[i]);
}
}
}
/**
* 将 n 转换为数字 n=3 {1,2,3}
* @param n
* @return
*/
public static int[] ntoarray(int n){
int[] ns = new int[n];
for (int i = 0; i ns.length; i++) {
ns[i] = i + 1;
}
return ns;
}
/**
* 判断数组里是否只有一个数不为0
* @param ns
* @return
*/
public static boolean isone(int[] ns){
boolean isone = false;
for (int i = 0; i ns.length; i++) {
if(isone == false ns[i] != 0){
isone = true;
}else if(isone == true ns[i] != 0){
return false;
}
}
return isone;
}
}
package 约瑟夫环;
import java.util.LinkedList;
import java.util.List;
/**
* 约瑟夫环问题的一种描述是:编号为1.2.3…….n的n个人按顺时针方向围坐一圈 ,每人手持一个密码(正整数),
* 开始任意选一个整数作为报数上限值,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,
* 将他的密码作为新的m值,从他顺时针下一个人开始重新从1开始报数,
* 如此下去直到所有的人全部都出列为止。试设计程序实现,按照出列的顺序打印各人的编号。
* @author Administrator
*
*/
public class Question2 {
class person {
int password;
int number;
int state = 1;
public person(int password, int number) {
this.password = password;
this.number = number;
}
public person(int number){
this.number = number;
}
}
public int ListLength(Listperson list) {
int count = 0;
if (list != null) {
for (person p : list) {
if (p.state != 0) {
count++;
}
}
}
return count;
}
public void cacle() {
// 初始化数据
Listperson list = new LinkedListperson();
list.add(new person(3,1));
list.add(new person(1,2));
list.add(new person(7,3));
list.add(new person(2,4));
list.add(new person(4,5));
list.add(new person(8,6));
list.add(new person(4,7));
int position = -1;//初始位置
int m = 20; //第一次报多少的人出来
int count = 0;//已经报了多少人
while (ListLength(list) != 0) {
position = (position + 1) % list.size();// 位置定位
if (((person) list.get(position)).state != 0) {
count++;
}
if (count == m) {
person p = list.get(position);
System.out.print(p.number+" ");
p.state = 0;
m = p.password;
list.set(position, p);
count = 0;
}
}
}
public static void main(String[] args) {
Question2 q= new Question2();
q.cacle();
}
}
跟这差不多的。
数组没法连成环,要想要环形,可以用链表,单项环形链表是个环。
分享标题:约瑟夫环java代码数组 约瑟夫环c++代码数组
链接分享:https://www.cdcxhl.com/article28/ddicpjp.html
成都网站建设公司_创新互联,为您提供云服务器、微信公众号、网站建设、外贸建站、电子商务、域名注册
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联