Joseph Problem With Passwords In Java
问题描述:
编号为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的更多相关文章
- 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 ...
- 【LeetCode/LintCode 题解】约瑟夫问题 · Joseph Problem
n个人按顺序围成一圈(编号为1~n),从第1个人从1开始报数,报到k的人出列,相邻的下个人重新从1开始报数,报到k的人出列,重复这个过程,直到队伍中只有1个人为止,这就是约瑟夫问题.现在给定n和k,你 ...
- java标准-密码用数组比用字符串安全
转载:http://my.oschina.net/jasonultimate/blog/166968 1) Since Strings are immutable in Java if you sto ...
- 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 ...
- 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 ...
- 如何解决 Java 安全问题?
如何解决 Java 安全问题,目前的应对策略都十分笨拙,往往适得其反.幸运的是,有一种新的方法可以将安全机制嵌入 Java 执行平台--或者更具体地说,嵌入 Java 虚拟机中,进而规避一些「Big ...
- 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. ...
- ACM java写法入门
打2017icpc沈阳站的时候遇到了大数的运算,发现java与c++比起来真的很赖皮,竟然还有大数运算的函数,为了以后打比赛更快的写出大数的算法并且保证不错,特意在此写一篇博客, 记录java的大数运 ...
- Passwords Gym - 101174E (AC自动机上DP)
Problem E: Passwords \[ Time Limit: 1 s \quad Memory Limit: 256 MiB \] 题意 给出两个正整数\(A,B\),再给出\(n\)个字符 ...
- 干货 | 10分钟带你彻底了解column generation(列生成)算法的原理附java代码
OUTLINE 前言 预备知识预警 什么是column generation 相关概念科普 Cutting Stock Problem CG求解Cutting Stock Problem 列生成代码 ...
随机推荐
- 1839:【05NOIP提高组】谁拿了最多奖学金
1839:[05NOIP提高组]谁拿了最多奖学金 时间限制: 1000 ms 内存限制: 65536 KB提交数: 9569 通过数: 4431 [题目描述] 某校的惯例是在每 ...
- oracle 行转列,动态年份,月份列。已解决!
-----------------存储过程包体----------- procedure GetComparativeAnalysisTB(p_StartTime varchar2, ----开始时间 ...
- 苹果App 上架 app store 提示 “一张或多张屏幕快照的尺寸存在错误“
获取预览图的方式有两种:第一种是用真机运行然后截图获取:另一种是用模拟器运行然后截图获取. 先说说第一种获取方式:app运行在5.5英寸(6+)的手机上,截取屏幕快照.在上传时会报错:"一张 ...
- linux系统下命令行方式创建KVM虚拟机
一:安装虚拟机 1:设备重启进入BIOS打开SMMU,F10保存退出. 2:进入系统安装相关组件 virt-install qemu-kvm qemu-img virt-manager libvi ...
- 题解[CF1628F]A_Random_Code_Problem
题意 给定一个数组 \(a\),进行 \(k\) 次操作.第 \(i\) 操作等概率随机 \(a\) 中一个元素 \(a_x\),将这个元素的值加入答案,并使其减去 \(a_x\bmod i\) .问 ...
- dayjs取 本周、上周、本月、上月、本季度、上季度时间段
let dateTimes = [ { id: 1, name: '本周', start_time: dayjs().startOf('week').add(1, 'day').format('YYY ...
- 加密算法和hash
随着安全问题越来越被重视,公司也全面替换了HTTP为HTTPS.2015年iOS9的ATS到今年苹果更是放出话来,2017年全面支持HTTPS,不支持的App,在审核的时候可能会遇到麻烦.鉴于此,我有 ...
- [前端js] 爬取亿图脑图大纲
这段程序使看到了好的东西,又没有零钱的产物 还是老师让画思维导图我不想画还想白嫖的想法 用时20分钟 就拿这个来作为例子 https://mm.edrawsoft.cn/template/286842 ...
- .NET Core读写InfluxDB时序数据库的方法教程
前言 在我们很多应用中会遇到有一种基于一系列时间的数据需要处理,通过时间的顺序可以将这些数据点连成线,再通过数据统计后可以做成多纬度的报表,也可通过机器学习来实现数据的预测告警.而时序数据库就是用于存 ...
- 一套 .NET开发的邮箱Mail开源库
今天给大家推荐一个基于.Net开发的邮箱开源库. 邮箱在我们日常工作中,可以说是非常常见了.个人邮箱一般都是免费的,但企业邮箱会收费,虽然一般情况下,市面邮箱已经够用了.但有些企业对内容安全要求比较严 ...