在一只热气球上有15个日本人和15个美国人,由于热气球超重,必须要跳下去15个人。按照商讨的规则,从第一个人开始数起,第九个人被选做要跳下的人,以此类推。最终热气球上只剩下15个美国人,试编写一段程序,打印出那15个日本人的位置。
import java.io.*;
public class Yuesefu2 {
public static class Ren {
private int weizhi;
Ren next;
public Ren() {
}
public Ren(int i) {
weizhi = i;
}
}
public static void main(String[] args) throws IOException {
Ren a1 = new Ren(1);
Ren list = new Ren();
list = a1;
for (int i = 2; i <= 30; i++) {
Ren a = new Ren(i);
list.next = a;
list = list.next;
}
list.next = a1;
for (int j = 1; j <= 15; j++) {
for (int m = 1; m <= 8; m++) {
list = list.next;
}
System.out.println("第" + list.next.weizhi + "个人是日本人");
list.next = list.next.next;
}
}
}
问题描述:设编号为1,2,…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始时任意给出一个报数上限值m,从第一个人开
始顺时针方向自1起顺序报数,报到m时停止报数,抱m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1起顺序报
数;如此下去,直到所有人全部出列为止。要求用JAVA设计一个程序模拟此过程,并给出出列人的编号序列。
测试数据:
初始报数上限值m = 20
n = 7,七个人的密码依次为3,1,7,2,4,8,4
*/
import javax.swing.*;
public class Yuesefu
{
public static void main(String[] args)
{
JOptionPane input =new JOptionPane();
int n=Integer.parseInt(input.showInputDialog("请输入总人数:"));
Ren a1=new Ren(1,Integer.parseInt(input.showInputDialog("请输入第1个人的密码")));
Ren index=a1;// j 指向人
for(int i=2;i<=n;i++)//初始化每个人
{
index.next=new Ren(i,Integer.parseInt(input.showInputDialog("请输入第"+i+"个人的密码")));
index=index.next;
}
index.next=a1;
int m=Integer.parseInt(input.showInputDialog("请输入初始密码:"));
for(int i=0;i<7;i++)
{
for(int k=0;k<m-1;k++)//轮转
{
index=index.next;
}
System.out.println("第"+index.next.flag+"个人出局");
input.showMessageDialog(null,"第"+index.next.flag+"个人出局");
m=index.next.mima;//可以实现剔除后转换为此人拥有的密码.
index.next=index.next.next;
}
}
public static class Ren//定义人的链表
{
private int flag;//序号
private Ren next;//指针
private int mima;
public Ren(int n,int m)
{
flag=n;
mima=m;
}
}
}
着名的算法问题,约瑟夫环的c语言实现是利用了指针链表的形式,java实现呢,我的这个是用了内部类.
算法描述:n个人围成一圈,每人有一个各不相同的编号,选择一个人作为起点,然后顺时针从1到k数数,每数到k的人退出圈子,圈子缩小,然后从下一个人继续从1到k数数,重复上面过程。求最后推出圈子的那个人原来的编号。
程序实现:
public class JosephCircle {
private class Node {
public Node nextnode;
public boolean flag;
}
private Node[] list;
public JosephCircle() {
list = new Node[30];
int i;
for (i = 0; i < 30; i++) {
Node node = new Node();
node.flag = true;
if (i > 0) {
list[i - 1].nextnode = node;
}
list[i] = node;
}
list[i - 1].nextnode = list[0];
}
public void start() {
Node node = list[29];
for (int i = 0; i < 135; i++) {
if ((i+1) % 8 == 0) {
node.flag = false;
node.nextnode = node.nextnode.nextnode;
} else {
node = node.nextnode;
}
}
}
public void print() {
Node node = list[29];
for (int i = 0; i < 30; i++) {
if (node.flag) {
System.out.print("#");
} else {
System.out.print("@");
}
node = node.nextnode;
}
}
public static void main(String[] args) {
JosephCircle jc = new JosephCircle();
jc.start();
jc.print();
}
}
ublic static void main(String args[]) {
List<Integer> a = new ArrayList<Integer>();
for (int i = 1; i <= 500; i++) {
a.add(i);// 把每个小朋友的号码依次放入.
}
int num=0,currentIndex=0;
while (a.size() > 1) {
num++;
if(num==3){
a.remove(currentIndex);
currentIndex--;
num=0;
}
currentIndex++;
if(currentIndex>=a.size())
currentIndex=0;
}
System.out.println("最后一个小朋友的号码是: " + a.get(0));
}
import java.util.Scanner;
/**
*使用数组实现约瑟夫环问题
*由m个人围成一个首尾相连的圈报数。
*从第一个人开始,从1开始报数,报到n的人出圈,
*剩下的人继续从1开始报数,直到所有的人都出圈为止。
*对于给定的m和n,求出所有人的出圈顺序.
*/
public class RingTest{
public static void main(String[] args){
System.out.println("程序说明如下:");
System.out.println("由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序.");
//提示输入总人数
System.out.println("请输入做这个游戏的总人数:");
Scanner sca=new Scanner(System.in);
int m=sca.nextInt();
//提示输入要出圈的数值
System.out.println("请输入要出圈的数值:");
int n=sca.nextInt();
System.out.println("按出圈的次序输出序号:");
//创建有m个值的数组
int[] a=new int[m];
//初始长度,以后出圈一个,长度就减一
int len=m;
//给数组赋值
for(int i=0;i<a.length;i++)
a[i]=i+1;
//i为元素下表,j代表当前要报的数
int i=0;
int j=1;
while(len>0){
if(a[i%m]>0){
if(j%n==0){//找到要出圈的人,并把圈中人数减一
System.out.print(a[i%m]+" ");
a[i%m]=-1;
j=1;
i++;
len--;
}else{
i++;
j++;
}
}else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数
i++;
}
}
}
}