
正文
圆桌报数java代码 圆桌报数问题
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
java 约瑟夫环 我有问题
/**
* @Title: YueSeFH.java
* @Package com.cn.zh.interesting.test
* @Description: TODO(约瑟夫环代码)
* @author zhh
* @date 2014年4月18日 下午2:28:25
* @version V1.0
*/
package com.cn.zh.interesting.test;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
/**
* @ClassName: YueSeFH
* @Description: TODO(约瑟夫环是一个数学的应用问题圆桌报数java代码:
* 已知n个人(以编号1圆桌报数java代码,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个 人出列;
* 他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。)
* @author zhanghua
* @date 2014年4月18日 下午2:28:25
*
*/
public class YueSeFH {
/**
* @Title: main
* @Description: TODO(main方法)
* @param @param args
* @return void
* @throws
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int n = 0; // 总共几个人参加游戏
int m = 0; // 从编号为多少的人开始报数
int k = 0; // 以数字几为出列数
System.out.print("请输入总共几个人参加游戏:");
while (true) {
try {
// 数组缓冲
byte[] b = new byte[1024];
int j = 0;
// 读取数据
j = System.in.read(b);
// 转换为字符串
String str = new String(b, 0, j - 2);
if (StringUtils.isNotEmpty(str)) {
try {
n = Integer.parseInt(str);
break;
} catch (NumberFormatException nfe) {
// TODO: handle exception
System.out.println("让你输入的是几个人,是数字,明白??");
}
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("晕,咋出错圆桌报数java代码了,再重新输一次吧圆桌报数java代码!!");
}
}
System.out.print("请输入从编号为多少的人开始报数:");
while (true) {
try {
// 数组缓冲
byte[] b = new byte[1024];
int j = 0;
// 读取数据
j = System.in.read(b);
// 转换为字符串
String str = new String(b, 0, j - 2);
if (StringUtils.isNotEmpty(str)) {
try {
m = Integer.parseInt(str);
if (m n) {
System.out
.println("数学是体育老师教的吧,你输入的编号都超出总人数了,再输一次。。");
} else {
break;
}
} catch (NumberFormatException nfe) {
// TODO: handle exception
System.out.println("让你输入从哪个编号开始报数,傻了啊??");
}
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("晕,咋出错了,再重新输一次吧!!");
}
}
System.out.print("请输入以数字几为出列数:");
while (true) {
try {
// 数组缓冲
byte[] b = new byte[1024];
int j = 0;
// 读取数据
j = System.in.read(b);
// 转换为字符串
String str = new String(b, 0, j - 2);
if (StringUtils.isNotEmpty(str)) {
try {
k = Integer.parseInt(str);
break;
} catch (NumberFormatException nfe) {
// TODO: handle exception
System.out.println("让圆桌报数java代码我说你什么好,是以数字几为出列数,数字、数字。。");
}
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("晕,咋出错了,再重新输一次吧!!");
}
}
// 根据输入的总人数,生成一个数组
ListInteger list = new ArrayListInteger();
for (int i = 1; i = n; i++) {
list.add(i);
}
// 调用函数计算约瑟夫环
String str = yueSeFH(list, m, k);
System.out.println(str);
}
/**
*
* @Title: yueSeFH
* @Description: TODO(回调函数计算约瑟夫环)
* @param list
* 总共人数的一个集合
* @param m
* 从编号为m开始报数
* @param k
* 以数字k为出列数
* @return void
* @throws
*/
private static String yueSeFH(ListInteger list, int m, int k) {
String str = "";
if (list.size() == 1) {
System.out.println("剩下最后的同学是:" + list.get(0));
return "";
} else {
int j = k % list.size(); // 取余,出列数比总人数大,也只是挨着数,直到完为止,取余可以直接进行最后一轮
if ((list.size() - m + 1) = j) { // 判断从编号位置开始到整个集合完毕的个数是否大于取余的结果j,如果大于,说明本轮即可排出出列,否则,得从集合第一个开始继续数
j = j + m - 2;
} else {
j = j - (list.size() - m) - 2;
}
str = list.get(j).toString();
list.remove(j); // 符合条件则删除一个
m = (j + 1); // 记录下一个要开始报数的人员
if (list.size() m) {
m = m - list.size();
}
return str + "," + yueSeFH(list, m, k); // 继续回调,直到集合list只剩一个人为止
}
}
}
相关问答
Q1: 1. 设有n个人围做在圆桌周围,从某个位置开始用自然数进行编号为1,2….,n. 然后从编号为k的人从1开始报数,
#include stdio.h
#define N 10 //定义个数
#define C 3 //定义报数
int main()
{
int a[N];
int i,j,count;
//初始化数组
for(i=0;iN;i++)
{
a[i]=i+1;
}
count=N;//计数器
//循环处理前N-1个编号,每次查找出,将计数器递减,直到为1
printf("依次出局:\n");
for(i=0,j=0;count1;)
{
if(a[i%N]!=0)//如果此数不为0,代表没有出局
{
if(j==C-1)//累加到报数个
{
i=i%N;//循环取编号
printf("%d ",a[i]);//输出
a[i]=0; //置0圆桌报数java代码,代表出局
j=0; //置j=0,重新计数
count--; //计数器减一
while(a[i]==0)//寻找下一个没有出局圆桌报数java代码的编号
{
i++;
i=i%N;//循环取编号
}
continue;//直接执行下一个外循环
}
else//否则累加报数个数
j++;
}
i++;
}
//处理最后一个
printf("\n最后一个:%d\n",a[i]);//输出
getchar();
return 0;
}
看看吧理解一下圆桌报数java代码,吧这个看懂了 也不知道 这个是不是圆桌报数java代码你要的啊,这个好像不是从某个位置报数,而是从第一个人保的啊
Q2: 13人围成一圈,从第一个人开始依次报数1,2,3.凡报到"3"者退出圈子
/*
* main.c
* 循环链表实现约瑟夫问题
* Created on: Nov 6, 2010
* Author: jenson
*/
#include stdlib.h
typedef struct node* link;
struct node {
int item;
link next;
};
int main(){
int i;
int N = 9,M=5;
link t = (link)malloc(sizeof(*t));
link x = t;
t-item = 1;
t-next = t;
for(i = 2;i=N;i++){
x = (x-next = (link)malloc(sizeof(*x)));
x-item = i;
x-next = t;
}
while(x!=x-next){
for(i = 1;iM;i++){
x = x-next;
}
x-next = x-next-next;
N--;
}
printf("%d\n",x-item);
free(t);
return 0;
}
/* ==================================================== */
/* 程序名称: arrayList.c */
/* 程序目圆桌报数java代码的: 用数组实现约瑟夫问题 */
/* 程序作者: aimt ( computer 021 ) */
/* ==================================================== */
#includestdio.h
#define size 100 /* 输入人数的上限 */
void main()
{
int person[size];
int i, j; /* 循环修正变量 */
int arrayLen; /* 数组长度 */
int start, overNum; /* 开始位置各跨过位置 */
int deleNum; /* 出列人所在数组中的下标 */
int name, total; /* 输入时,人的信息以及人的总数 */
printf( "请输入圆桌上人的总数: " );
scanf( "%d", arrayLen ); printf( "\n" );
if( ( arrayLen size ) || ( arrayLen 0 ) )
{
printf( "超出范围,请重新输入: " );
scanf( "%d", arrayLen ); printf( "\n" );
};
printf( "请输入各个人的信息(整数): \n" );
for( i = 0; i arrayLen; i++ )
{
scanf( "%d", name );
person[i] = name;
}
printf( "圆桌报数java代码你输入的数据的顺序为: \n" );
for( i = 0; i arrayLen - 1; i++ )
printf( " %d ==", person[i] );
printf( "%d \n", person[arrayLen - 1] );
printf( "圆桌报数java代码你打算从第几个人开始? 请输入开始号: " );
scanf( "%d", start );
printf( "\n" );
start = start - 1;
printf( "请输入相邻两出列人之间的间隔: " );
scanf( "%d", overNum );
printf( "\n" );
total = arrayLen;
printf( "程序运行后,出列人的顺序为:\n\n" );
for( i = 0; i total; i++ ) /* 要打印total个人的情况,故做total次 */
{
if ( arrayLen == 1 )
printf( "%d", person[0] ); /* 如果是数组只剩一个元素,直接出列 */
else
{
deleNum = ( start + overNum - 1 ) % arrayLen; /* 此取模保证循环 */
printf( "%d == ", person[deleNum] );
for ( j = deleNum; j arrayLen; j++ ) /* 将出列元素后面的各元素前移 */
person[j] = person[j+1];
start = deleNum;
arrayLen = arrayLen - 1; /* 移动完毕后,数组长度减1 */
}
}
printf( "\n\n" );
}
你问的这个问题很有名,叫约瑟夫问题,网上有很多现成的代码,给你找了2个
Q3: java编程:链表
remove方法应该可以简化一下:
public class Test {
public static void main(String[] args) {
//n = 9, k = 1, m = 5
int ppl =9;
int interval = 5;
Link link =new Link();
for(int i=1;i=ppl;i++){
Node node = new Node();
node.setNumber(i);
link.add(node);
}
link.first();
while(link.size0){
for(int j=1;jinterval;j++)
link.next();
link.remove();
}
}
static class Link{
Node head;
Node current;
int size;
public void remove(){
System.out.println("出列 : "+ current.number);
if(current.prior!=null){
if(current.next!=null){
current.prior.next = current.next;
current.next.prior= current.prior;
}else{
current.prior.next = null;
}
}else{
if(current.next!=null)
current.next.prior = null;
}
if(head==current) head= current.next;
current = current.next;
size--;
}
public void add(Node node){
size ++;
if(head==null) {
head = node;
current = node;
node.setNext(node);
return;
}
current.setNext(node);
node.setNext(head);
current = node;
}
public Node first(){
current = head;
return head;
}
public Node next(){
current = current.next;
return current;
}
}
static class Node{
int number;
Node next;
Node prior;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
next.prior = this;
}
public Node getPrior() {
return prior;
}
}
}
Q4: 求写一个java程序
约瑟夫环问题
public class Main {
public static void main(String[] args) {
//50个人,从第一个人开始数,数到3的人出列
countThree(50, 0, 3);
}
/**
* 约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
* 从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,
* 数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
*
* @param n 人的总数
* @param start 开始报数的序号,start n
* @param m 出列的标记(可以大于n)
*/
private static void countThree(int n, int start, int m) {
ListInteger list = new ArrayListInteger();
//初始化列表
for (int i = 1; i = n; i++) {
list.add(i);
}
while (list.size() 0) {
//将前连个移入列表尾端
for (int j = 0; j m-1; j++) {
list.add(list.remove(start));
}
//打印出列的序号
System.out.println(list.remove(start));
}
}
}
关于圆桌报数java代码和圆桌报数问题的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







