问题描述:

编号为1,2,......,n的n个人(每个人的信息有编号、姓名和密码三项)按照顺时针方向围坐一圈,

每个人有且只有一个密码(正整数,密码用随机方式赋值,范围1-15)。一开始任选一个正整数作为报数

上限值,从第一个人开始顺时针方向自1开始报数,报到m时停止报数。报m 的人出列,将他的密码作为新

的m 值,从他在顺时针方向的下一个人开始重新报数,如此下去,直到所有人全部出队为止。设计一个程

序来求出队顺序。

分析:

为解决约瑟夫问题而设计的单向循环链表,应实现如下功能 :
1  添加元素
2  拥有指示当前选中元素的游标
3  游标可循环访问链表中各元素
4  可将游标向前移动指定步数
5  可删除当前游标所指定的元素
*输入:每个人的信息;起始m值
*输出:出队的人信息。

步骤:

1 确定数据类型
2 建立链表
3 实现循环方法
4 输出结果

 1 import  java.util.*;
2 import java.io.*;
3
4 public class JosephProb {
5 static int N;
6
7 public static void main(String[] args) throws IOException{
8 CircleLinkList list=new CircleLinkList();
9 Scanner sc=new Scanner(System.in);
10 System.out.print("请输入参加的总人数N :");
11 N=sc.nextInt();
12
13 int i,data[][]=new int [N][2];
14 String name[]=new String[N];
15 System.out.println("请输入每个人的编号和姓名:");
16 for( i=0;i<N;i++){
17 data[i][0]=sc.nextInt();
18 name[i]=sc.nextLine();
19 }
20 System.out.print("请输入初始密码值(正整数):");
21 int m=sc.nextInt();
22
23 //生成密码
24 List<Integer> l = new ArrayList<Integer>();
25 while(l.size()<N){
26 int j = (int)(Math.random()*15+1);
27 l.add(j);
28 }
29 //初始化
30 for(i=0;i<N;i++){
31 data[i][1]=l.get(i);
32 list.Init(data[i][0],name[i],data[i][1]);
33 }
34 //出列
35 list.Operation(m);
36 System.out.println("Over!");
37 }
38 }
39 class Person{
40 int number;
41 int password;
42 String names;
43 Person next;
44 public Person (int number,String names,int password){
45 this.number=number;
46 this.names=names;
47 this.password=password;
48 this.next=null;
49 }
50 }
51 class CircleLinkList {
52 Person head;//头结点
53 Person current;
54
55 public boolean isEmpty(){ return head==null; }
56
57 public void Init(int number,String names,int password) {
58 Person tmp=new Person(number,names,password);
59 if(this.isEmpty()){
60 head=tmp;
61 current=head;
62 }
63 else{
64 current.next=tmp;
65 current=tmp;
66 }
67 //最后一个节点的next指向第一个
68 current.next = head;
69 }
70
71 public void Operation(int m){
72 System.out.println("出列人信息:[编号 姓名 密码]");
73 while(current!=current.next){
74 for(int i=1;i<m;i++){ //从1开始报数,到m时停止报数
75 current=current.next;//指针移动到出列的前一个节点
76 }
77 m=current.next.password;//修改密码为出列人的密码
78 //输出-出队人的信息
79 System.out.print("["+current.next.number+" "+current.next.names+" "+current.next.password+"]\n");
80 current.next=current.next.next;//删除
81 }
82 System.out.println();
83 System.out.println("最后剩余的是 ["+current.number+" "+current.names+" "+current.password+" ]");
84 }
85 }

补充:

可以将出队的人用队列进行存储,并输出。

实现就是新建一个QueueList,添加Insert()输出Dequeue()即可。

代码略。

Joseph Problem With Passwords In Java的更多相关文章

  1. LeetCode 218. The Skyline Problem 天际线问题(C++/Java)

    题目: A city's skyline is the outer contour of the silhouette formed by all the buildings in that city ...

  2. 【LeetCode/LintCode 题解】约瑟夫问题 · Joseph Problem

    n个人按顺序围成一圈(编号为1~n),从第1个人从1开始报数,报到k的人出列,相邻的下个人重新从1开始报数,报到k的人出列,重复这个过程,直到队伍中只有1个人为止,这就是约瑟夫问题.现在给定n和k,你 ...

  3. java标准-密码用数组比用字符串安全

    转载:http://my.oschina.net/jasonultimate/blog/166968 1) Since Strings are immutable in Java if you sto ...

  4. 10 Things Every Java Programmer Should Know about String

    String in Java is very special class and most frequently used class as well. There are lot many thin ...

  5. Core Java Volume I — 3.3. Data Types

    3.3. Data TypesJava is a strongly typed language(强类型语音). This means that every variable must have a ...

  6. 如何解决 Java 安全问题?

    如何解决 Java 安全问题,目前的应对策略都十分笨拙,往往适得其反.幸运的是,有一种新的方法可以将安全机制嵌入 Java 执行平台--或者更具体地说,嵌入 Java 虚拟机中,进而规避一些「Big ...

  7. How to check for and disable Java in OS X

    Java used to be deeply embedded in OS X, but in recent versions of the OS it's an optional install. ...

  8. ACM java写法入门

    打2017icpc沈阳站的时候遇到了大数的运算,发现java与c++比起来真的很赖皮,竟然还有大数运算的函数,为了以后打比赛更快的写出大数的算法并且保证不错,特意在此写一篇博客, 记录java的大数运 ...

  9. Passwords Gym - 101174E (AC自动机上DP)

    Problem E: Passwords \[ Time Limit: 1 s \quad Memory Limit: 256 MiB \] 题意 给出两个正整数\(A,B\),再给出\(n\)个字符 ...

  10. 干货 | 10分钟带你彻底了解column generation(列生成)算法的原理附java代码

    OUTLINE 前言 预备知识预警 什么是column generation 相关概念科普 Cutting Stock Problem CG求解Cutting Stock Problem 列生成代码 ...

随机推荐

  1. 1839:【05NOIP提高组】谁拿了最多奖学金

    1839:[05NOIP提高组]谁拿了最多奖学金 时间限制: 1000 ms         内存限制: 65536 KB提交数: 9569     通过数: 4431 [题目描述] 某校的惯例是在每 ...

  2. oracle 行转列,动态年份,月份列。已解决!

    -----------------存储过程包体----------- procedure GetComparativeAnalysisTB(p_StartTime varchar2, ----开始时间 ...

  3. 苹果App 上架 app store 提示 “一张或多张屏幕快照的尺寸存在错误“

    获取预览图的方式有两种:第一种是用真机运行然后截图获取:另一种是用模拟器运行然后截图获取. 先说说第一种获取方式:app运行在5.5英寸(6+)的手机上,截取屏幕快照.在上传时会报错:"一张 ...

  4. linux系统下命令行方式创建KVM虚拟机

      一:安装虚拟机 1:设备重启进入BIOS打开SMMU,F10保存退出. 2:进入系统安装相关组件 virt-install qemu-kvm qemu-img virt-manager libvi ...

  5. 题解[CF1628F]A_Random_Code_Problem

    题意 给定一个数组 \(a\),进行 \(k\) 次操作.第 \(i\) 操作等概率随机 \(a\) 中一个元素 \(a_x\),将这个元素的值加入答案,并使其减去 \(a_x\bmod i\) .问 ...

  6. dayjs取 本周、上周、本月、上月、本季度、上季度时间段

    let dateTimes = [ { id: 1, name: '本周', start_time: dayjs().startOf('week').add(1, 'day').format('YYY ...

  7. 加密算法和hash

    随着安全问题越来越被重视,公司也全面替换了HTTP为HTTPS.2015年iOS9的ATS到今年苹果更是放出话来,2017年全面支持HTTPS,不支持的App,在审核的时候可能会遇到麻烦.鉴于此,我有 ...

  8. [前端js] 爬取亿图脑图大纲

    这段程序使看到了好的东西,又没有零钱的产物 还是老师让画思维导图我不想画还想白嫖的想法 用时20分钟 就拿这个来作为例子 https://mm.edrawsoft.cn/template/286842 ...

  9. .NET Core读写InfluxDB时序数据库的方法教程

    前言 在我们很多应用中会遇到有一种基于一系列时间的数据需要处理,通过时间的顺序可以将这些数据点连成线,再通过数据统计后可以做成多纬度的报表,也可通过机器学习来实现数据的预测告警.而时序数据库就是用于存 ...

  10. 一套 .NET开发的邮箱Mail开源库

    今天给大家推荐一个基于.Net开发的邮箱开源库. 邮箱在我们日常工作中,可以说是非常常见了.个人邮箱一般都是免费的,但企业邮箱会收费,虽然一般情况下,市面邮箱已经够用了.但有些企业对内容安全要求比较严 ...