圆桌报数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 (mn) {
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() - m1) = j) { // 判断从编号位置开始到整个集合完毕的个数是否大于取余的结果j,如果大于,说明本轮即可排出出列,否则,得从集合第一个开始继续数
j = jm - 2;
} else {
j = j - (list.size() - m) - 2;
}
str = list.get(j).toString();
list.remove(j); // 符合条件则删除一个
m = (j1); // 记录下一个要开始报数的人员
if (list.size()m) {
m = m - list.size();
}
return str","yueSeFH(list, m, k); // 继续回调 , 直到集合list只剩一个人为止
}
}
}
1. 设有n个人围做在圆桌周围 , 从某个位置开始用自然数进行编号为1,2….,n. 然后从编号为k的人从1开始报数,#include stdio.h
#defineN 10//定义个数
#defineC 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代码你要的啊,这个好像不是从某个位置报数 , 而是从第一个人保的啊
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( ( arrayLensize ) || ( arrayLen0 ) )
{
printf( "超出范围,请重新输入: " );
scanf( "%d", arrayLen ); printf( "\n" );
};
printf( "请输入各个人的信息(整数): \n" );
for( i = 0; iarrayLen; i)
{
scanf( "%d", name );
person[i] = name;
}
printf( "圆桌报数java代码你输入的数据的顺序为: \n" );
for( i = 0; iarrayLen - 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; itotal; i)/* 要打印total个人的情况,故做total次 */
{
if ( arrayLen == 1 )
printf( "%d", person[0] );/* 如果是数组只剩一个元素,直接出列 */
else
{
deleNum = ( startoverNum - 1 ) % arrayLen; /* 此取模保证循环 */
printf( "%d == ", person[deleNum] );
for ( j = deleNum; jarrayLen; j)/* 将出列元素后面的各元素前移 */
person[j] = person[j 1];
start = deleNum;
arrayLen = arrayLen - 1;/* 移动完毕后,数组长度减1 */
}
}
printf( "\n\n" );
}
你问的这个问题很有名 , 叫约瑟夫问题 , 网上有很多现成的代码,给你找了2个
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;
}
}
}
求写一个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 开始报数的序号,startn
* @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; jm-1; j) {
list.add(list.remove(start));
}
//打印出列的序号
System.out.println(list.remove(start));
}
}
}
【圆桌报数java代码 圆桌报数问题】关于圆桌报数java代码和圆桌报数问题的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读