約瑟夫環java簡單實現
『壹』 如何用java實現約瑟夫環問題急!
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int number;
int mima;
struct node * next;
}Node, *Link;
Link Init(void)
{
Link L;
L = (Link)malloc(sizeof(Node));
L->next = L;
return L;
}
void Insert(Link L, int e_mima, int e_number)
{
Link p,q;
p = (Link)malloc(sizeof(Node));
p->mima = e_mima;
p->number = e_number;
q = L;
while(q->next != L)q = q->next;
p->next = q->next;
q->next = p;
}
void Delete(Link L, int i)
{
Link p,q;
q = L;
while(q->next != q && q->next->number != i)
q = q->next;
if(q->next->number == i)
{
p = q->next;
q->next = p->next;
free(p);
}
}
void main()
{
Link p,q,L;
int i,m,n,mima;
printf("請輸入人數和初始密碼:");
scanf("%d%d",&n,&m);
if(n<=0 || m<=0)return;
L = Init();
i=1;
while(i<=n)
{
printf("請輸入第 %d 個人的密碼:",i);
scanf("%d",&mima);
if(mima <= 0)continue;
Insert(L, mima, i);
i++;
}
i = 1;
p = L->next;
while(L->next != L)
{
q = p;
p = p->next;
if(p ==L)
{
q = p;
p = p->next;
}
i++;
if(i == m)
{
printf("%d\t",p->number);
m = p->mima;
Delete(L, p->number);
p = q;
i = 0;
}
}
}
『貳』 java編程序實現約瑟夫環
精簡易懂版本 剛寫的
public class Yuesefu {
// 數三退一 約瑟夫環 求最後留在環中小朋友的位置 即原來的編號(1-500)
/**
* 初始化數組,添加標號
*/
private void markID(int[] child) {
for (int i = 0; i <= child.length - 1; i++) {
child[i] = i + 1;
}
}
/**
* 求出小孩子原來的位置在什麼地方,從一開始
*/
public void re_index(int[] i) {
for (int ii : i) {
if (ii > 0) {
System.out.println("還在場內的小朋友的序號為 : " + ii);
}
}
}
/**
* 統計剩餘的同學
*/
public int record(int[] re) {
int reco = 0;
for (int i : re) {
if (i > 0) {
reco = reco + 1;
} else {
continue;
}
}
// System.out.println("目前還剩下:" + reco + " 個小朋友在圈圈裡面");
System.out.println("程序努力載入計算中.............................................................................................." + reco);
return reco;
}
public static void run() {
int childs[] = new int[500];
Yuesefu yuesefu = new Yuesefu();
yuesefu.markID(childs);
yuesefu.startGame(childs);
yuesefu.re_index(childs);
}
/**
* 游戲開始
*/
private void startGame(int[] i) {
int index = 0; // 用作循環
int leave = 0; // 用作離場
while (true) {
if (i[index] != 0) {// 還在場內
leave = leave + 1; // 報數
if (leave == 3) {// 判斷是否需要離場 需要
i[index] = 0; // 離場
leave = 0;// 重新報數
}
index = index + 1;// 下一個人預備
if (index == i.length) {// 已經到最後了 需重新循環
index = 0;
}
} else {// 不在場內
if (index == i.length - 1) {// 判斷此出場的人是否為最後一個人
index = 0;
}
index = index + 1;// 跳過
}
int x = new Yuesefu().record(i);// 統計剩餘人數
if (x == 1)
break;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
run();
}
}
『叄』 約瑟夫環的JAVA實現,在原有基礎上添加界面,事件處理還有異常處理,簡單即可,發郵箱[email protected]
import java.util.LinkedList;
/*
* @author Love yali_deng forever
*/
public class YueSeFu {
/*
* 約瑟夫環是一個數學的應用問題:
* 已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個
* 人出 列;
* 他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重復下去,直到圓桌周圍的人全部出列。
* @param args
*/
private static StringBuffer removedStr = new StringBuffer("");// 記錄出列的數字
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); // 獲取開始時間
process(5000,10,1);
System.out.println(removedStr.substring(0,removedStr.length() - 1));
long endTime = System.currentTimeMillis(); // 獲取結束時間
String str="程序運行時間:" + (endTime - startTime)+"ms";
System.out.println(str);
}
public static void process(int n,int k,int m) {
// 構建一個list,存放人數
LinkedList<Integer> list = new LinkedList<Integer>();
for (int i = 0; i < n; i++) {
if (i + k > n) {
list.add(i + k - n);
} else {
list.add(i + k);
}
}
int count = 1;// 記錄數的人數
cycleCal(list,count,m);
}
public static void cycleCal(LinkedList<Integer> list,int count,int m){
int len = list.size();
if (len > 1) {
for (int i = 0; i < len; i++) {
if (count == m) {// 第m個時,remove
removedStr.append(list.get(i)).append(",");
list.remove(i);
len = list.size();
i--;
count = 0;
}
count++;
}
cycleCal(list,count,m);
}
else if(len != 0){
removedStr.append(list.get(0)).append(",");
}
}
}
『肆』 java循環單鏈表實現約瑟夫環
看了你的代碼,不是很明白,給你提幾個建議吧:
1、不需要tail節點
2、remove方法應該對刪除節點前面的節點操作,而不是使用數字找
給你我修改的LinkList類,你參考一下:
publicclassLinkList{
privateNodehead;
intcurlen=0;
//創建鏈表
publicvoidcreatelist(intcode)throwsException{
insert(curlen,code);
}
publicvoidinsert(inti,intcode)throwsException{
Nodes=newNode(code);
if(i==0){
s.setNext(head);
head=s;
}
Nodep=head;
intj=0;
while(p!=null&&j<i-1){
p=p.getNext();
j++;
}
if(j>i||p==null){
thrownewException("插入位置不合理");
}
s.setNext(p.getNext());
p.setNext(s);
// tail=s;
// tail.setNext(head);
curlen=curlen+1;
}
publicvoidremove(inti)throwsException{
Nodep=head,q=null;
intj=0;
i=i-1;
while(j<i){
q=p;
p=p.getNext();
j++;
}
if(j>i||p==null)
thrownewException("刪除位置不合法");
if(q==null){
// tail.setNext(p.getNext());
head=head.getNext();
}else
q.setNext(p.getNext());
curlen=curlen-1;
}
/**
*按照節點刪除
*@parami
*@throwsException
*/
publicvoidremove(Nodep)throwsException{
if(p.getNext()==p){
p=null;
head=null;
}
else{
Nodeq=p.getNext();
p.setNext(q.getNext());
}
curlen=curlen-1;
}
publicvoidout(intm)throwsException{
Nodep=head;
if(m==1){
System.out.print("按照順序出列");
return;
}
intcount=1;
intn=m-1;
while(curlen>0){
if(count==n){
System.out.print(p.getNext().getData()+"");
remove(p);
count=1;
}else{
count++;
}
p=p.getNext();
}
}
publicvoiddisplay(){
Nodenode=head;
for(inti=0;i<2*curlen;i++){
System.out.print(node.getData()+"");
node=node.getNext();
}
System.out.println();
}
}
『伍』 約瑟夫環java實現報錯,菜鳥求解
問題原型:
傳說在很久很久以前,有一架搭載著n個人的飛機出現了故障,迫降在了一個荒島上。飛機徹底報廢後,這些人用飛機的殘骸建成了一艘只能容納一個人乘坐的小船,那麼怎麼去確定這n個人中哪個人有資格上船呢?於是,這n個人採用了下面的方式來解決這個困境。
問題描述:
假設有N個人圍成一圈,每個人都有從1到N的唯一順序編號。接下來從編號為1的人開始順序報數。報到M號的人退出這個圈。然後由下一個人重新由1開始進行報數,如此循環往復,那麼最終留下來的是編號為多少的那個人呢?
java編程代碼實現:
import java.util.Scanner;
public class countMethod {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//接收用戶輸入,獲得總人數N
System.out.println("請輸入參與的總人數:");
int N=sc.nextInt();
//接收用戶輸入,獲得出列人員的編號M
System.out.println("請輸入出列的人的編號:");
int M=sc.nextInt();
//建立布爾型的數組,長度為總人數
Boolean rs[]=new Boolean[N];
//初始化布爾型數組,初始值均為true
for(int i=0;i<N;i++){
rs[i]=true;
//System.out.println(rs[i]);
}
int n=N;//剩餘的人數
int m=0;//報數的編號
while(n>1){
for(int j=0;j<N;j++){
if(rs[j]){
m++;
if(m==M){
m=0;
rs[j]=false;
n--;
//System.out.println(rs[j]);
}
}
}
}
//列印出最後留下來的人員的編號
for(int k=0;k<N;k++){
if(rs[k]){
System.out.println("最後留下的是第"+(k+1)+"號。");
break;
}
}
}
}
『陸』 怎麼用java數組實現約瑟夫環
用java數組實現約瑟夫環
packageJosephround;
publicclassJoseround{
intsit;
intflagjo=0;
Joseround(){};
Joseround(intx){
sit=x;
}
voidsetflag(intx){
flagjo=x;
}
}
packageJosephround;
publicclassInijose{
Joseroundjo[];
staticintlength=0;
Inijose(){};
Inijose(intx){
jo=newJoseround[x];
for(inti=0;i<x;i++){
jo[i]=newJoseround(i+1);//創建對象數組
length++;
}
}
voiddelete(intn){
for(inti=n;i<length-1;i++){
jo[i]=jo[i+1];
}
length--;
}
}
packageJosephround;
importjava.util.Scanner;
publicclassText{
publicstaticvoidmain(String[]args){
intm,n;
System.out.println("inputm");
Scannerm1=newScanner(System.in);
m=m1.nextInt();
System.out.println("inputn");
Scannern1=newScanner(System.in);
n=n1.nextInt();
inttemp=0;
intx=0;
Inijosejoseph=newInijose(n);
while(joseph.length!=0){
for(inti=1;i<=m;i++){
joseph.jo[x].setflag(i);
if(joseph.jo[x].flagjo==m){
System.out.println(joseph.jo[x].sit);
joseph.delete(x);
x--;
}
if(x<joseph.length-1)x++;
elsex=0;
}
}
}
}
『柒』 用java在數組中實現約瑟夫環的問題, 要求寫明詳細注釋, 方法最好簡單一點, 初學者,
package ysfh;
/**
* 【約瑟夫環的問題】
* 有17個人(編號從1到16),按編號依次排列成一個圓環(編號16的接著編號為1 的人),從編號為1 的人開始報數,數到3的人退出圓環,如此循環,最後留下的那個人的編號是什麼?
* 1,2,3,4,5,6,7,8,,9,10,11,12,13,14,15,16
* 要求:請用面向對象的思想來處理這個問題並在下面寫出具體的代碼(可以選擇你熟悉的語言,如java/C++/C#等)
* @author Administrator
*
*/
public class Ysfh {
public static void main(String[] args) {
m(3,16);
}
public static void m(int m,int n){
int c = 1;
int[] ns = ntoarray(n);
while(isone(ns) == false){//如果數組中有一個以上的數不為0
for (int i = 0; i < ns.length; i++) {
if(ns[i] != 0 ){//等於0的都退出了 所以從所有不等於0的開始
if(c == m){//是第三個數 給他賦值0 並讓計數器c從1 開始
ns[i] = 0 ;
c = 1;
}else{//否則繼續計數器下一個
c++;
}
}
}
}
//循環輸出最後留下的數字
for (int i = 0; i < ns.length; i++) {
if(ns[i] != 0){//除0以外的數字 0代表刪除
System.out.println(ns[i]);
}
}
}
/**
* 將 n 轉換為數字 n=3 {1,2,3}
* @param n
* @return
*/
public static int[] ntoarray(int n){
int[] ns = new int[n];
for (int i = 0; i < ns.length; i++) {
ns[i] = i + 1;
}
return ns;
}
/**
* 判斷數組里是否只有一個數不為0
* @param ns
* @return
*/
public static boolean isone(int[] ns){
boolean isone = false;
for (int i = 0; i < ns.length; i++) {
if(isone == false && ns[i] != 0){
isone = true;
}else if(isone == true && ns[i] != 0){
return false;
}
}
return isone;
}
}
『捌』 關於約瑟夫環問題,用java 編寫程序,輸出n個人出圈的順序,書上的程序代碼如下,但是有幾點我搞不明白
你這個好麻煩啊, 理解 隊列 和 桟 的區別
隊伍 先進先出FIFO
桟 先進後出 LIFO
本程序明顯是隊伍!!!
importjava.util.*;
publicclassT{
publicstaticvoidmain(String[]args){
List<Integer>list=newLinkedList<Integer>();
//模擬15個人,編號是1-15
for(inti=1;i<=15;i++){
list.add(i);
}
//模擬叫到7的人出圈
show(list,7);
}
publicstaticvoidshow(List<Integer>list,intn){
inti=1;//每次報的數字
intcount=1;//記錄第幾次出圈
while(true){
//當list長度為1的時候代表就剩下1個人
if(list.size()==1){
System.out.println("第"+count+++"次是"+list.get(0));
return;
}
//每次獲取隊里第一個人
intvalue=list.get(0);
//報完數後移開該人
list.remove(0);
//如果報數的人報的數字為n,則列印
if(i==n){
i=1;
System.out.println("第"+count+++"次是"+value);
}else{
//如果報數的人報的數字不是n,將該人排到隊伍的後面,以便下次繼續叫號
list.add(value);
//產生下次報數的數字
i++;
}
}
}
}
『玖』 java編程實現約瑟夫問題
publicclassRingTest{
publicstaticvoidmain(String[]args){
System.out.println("程序說明如下:");
System.out.println("由m個人圍成一個首尾相連的圈報數。從第一個人開始,從1開始報數,報到n的人出圈,剩下的人繼續從1開始報數,直到所有的人都出圈為止。對於給定的m和n,求出所有人的出圈順序.");
//提示輸入總人數
System.out.println("請輸入做這個游戲的總人數:");
Scannersca=newScanner(System.in);
intm=sca.nextInt();
//提示輸入要出圈的數值
System.out.println("請輸入要出圈的數值:");
intn=sca.nextInt();
System.out.println("按出圈的次序輸出序號:");
//創建有m個值的數組
int[]a=newint[m];
//初始長度,以後出圈一個,長度就減一
intlen=m;
//給數組賦值
for(inti=0;i<a.length;i++)
a[i]=i+1;
//i為元素下表,j代表當前要報的數
inti=0;
intj=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++;
}
}
}
}
『拾』 約瑟夫環問題——猴子選大王,用java編寫
幫幫忙,謝謝啊