该用户从未签到
|
/ P8 W s% ]" Wimport java.util.Scanner;- L1 R, K! r0 Q
/**0 p( n) A* B% @" j' l9 v
*使用数组实现约瑟夫环问题3 s7 R) n, L8 e
*由m个人围成一个首尾相连的圈报数。/ r& r7 {: B' X8 ?
*从第一个人开始,从1开始报数,报到n的人出圈,% p! Z1 m8 ?9 n, t" A
*剩下的人继续从1开始报数,直到所有的人都出圈为止。; j) I9 Q6 g- g: E$ t/ d
*对于给定的m和n,求出所有人的出圈顺序.: {) p' v/ P; k5 `, {! m
*/ @! \# K2 v$ N, X9 D) Q
public class RingTest{
( `0 K3 a; G# n public static void main(String[] args){
) G" Z) N1 x& G System.out.println("程序说明如下:");! F- Z. X! e" Y; O/ x5 C& E" X
System.out.println("由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序.");
6 h9 j- L. O& i //提示输入总人数
{3 }3 g2 u" A: ] System.out.println("请输入做这个游戏的总人数:");
7 [* q+ V8 r' J0 W4 i& V8 z9 l Scanner sca=new Scanner(System.in);
/ Q/ y) D7 e+ d8 \( f; ? int m=sca.nextInt();" _; w- k% y1 S6 Y( ]
//提示输入要出圈的数值* ^# s6 a% F1 J5 ?. L( l9 W
System.out.println("请输入要出圈的数值:");
1 j: V j. H: C% P int n=sca.nextInt();1 h; o( J- j% A4 Y* W( d8 L
System.out.println("按出圈的次序输出序号:");
* I7 e; P0 L& R, T, n //创建有m个值的数组
" ~; u# L* @9 ]8 Y9 }( m int[] a=new int[m];
0 S l& [* E9 ]+ _$ K; M3 X( N" u //初始长度,以后出圈一个,长度就减一6 l q( n5 O! F8 l6 q; I
int len=m;3 Z2 {# A1 A8 C) t5 R% @# \% w4 Y" s( Q
//给数组赋值
% I7 ~' D2 ~7 V/ L% K" ]% Z5 V for(int i=0;i<a.length;i++) q' o9 X2 c9 J. ~6 l
a[i]=i+1;
0 z$ z# n) y* U //i为元素下表,j代表当前要报的数8 [, Y$ f1 A m! D) q H6 v
int i=0;/ ~& Z, h% S+ p- U2 Y& K
int j=1;8 y' x% I1 u2 V' G/ R
while(len>0){2 x5 T. c! `4 n6 j
if(a[i%m]>0){6 B+ q% }7 \+ [; d; y7 b1 t+ t
if(j%n==0){//找到要出圈的人,并把圈中人数减一
/ U1 ]& V+ l! c! H System.out.print(a[i%m]+" ");
7 q: f3 E# h; c, j9 Y8 p& K a[i%m]=-1;
' i: k2 l# c9 y/ D; t$ k s j=1;
- t" D' P; P/ V. n i++;
5 `; R, s2 y- ]+ s, i len--;' Y. V9 [/ w) [
}else{
# T- `" `/ m+ v2 |9 [: ^ i++;
/ O5 K6 j% v+ s. B1 R, S" J* z' o j++;
2 V- ^- i9 s+ \* h0 d }
1 \. }4 t! ]- G* d" y }else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数
3 e+ [+ a% V1 T7 R i++;( U! L: ~' x; ]! D
} W! R/ y/ Q: h& _' ?
}
4 k( P& d% b# l# S; G }
. d3 f! V* M) e/ Y5 ^! }}7 X l( r; S6 }& E A
& _. T+ v% E( A0 j' X
: E# |# S' k1 A. n' Z4 K |
|