我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 项目源码 > 约瑟夫环
总共48087条微博

动态微博

查看: 1336|回复: 4

约瑟夫环

[复制链接]

2

主题

0

听众

18

金钱

一袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-12-14 21:31:55 |只看该作者 |倒序浏览

, W2 l1 |# X) r* Q: Uimport java.util.Scanner;% W% _; a+ N; g  L+ E
/**4 P9 ?% ^6 G. c0 U9 X
*使用数组实现约瑟夫环问题
: k. A! r# d3 O. V*由m个人围成一个首尾相连的圈报数。4 K! ^4 n, R: Z; k
*从第一个人开始,从1开始报数,报到n的人出圈,9 Q$ B5 k, F, O9 h' Y
*剩下的人继续从1开始报数,直到所有的人都出圈为止。; J5 X" E! G6 u1 L2 X
*对于给定的m和n,求出所有人的出圈顺序.
* v1 @3 f- r: N9 a: U3 T*/6 S' N6 {; f: D' m) F
public class RingTest{  U4 X4 [; C& i
    public static void main(String[] args){/ F1 W- K8 T5 F, s, ?
        System.out.println("程序说明如下:");4 L$ X( I& ?( I, p0 ^: T4 P
        System.out.println("由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序.");
2 ~0 h2 _% E% i+ |6 }4 g) G        //提示输入总人数3 l: y0 V: `1 K4 y4 `1 n+ n( c
        System.out.println("请输入做这个游戏的总人数:");
3 h& {- a( I# S4 w: o5 V) k0 Y        Scanner sca=new Scanner(System.in);$ k  `* ]+ C$ B5 G  U
        int m=sca.nextInt();7 k: S+ Q% J" b
        //提示输入要出圈的数值8 z0 K% p9 F2 e5 m8 p  z$ y& j
        System.out.println("请输入要出圈的数值:");        
# i+ p* C3 Z* V( q" g' p        int n=sca.nextInt();
% }/ m! q9 [9 F* v  H( `- M' K        System.out.println("按出圈的次序输出序号:");        ! O3 g  j6 X4 c% V0 \7 |
        //创建有m个值的数组
. ^  Q1 {# w2 o. }5 @" h8 o        int[] a=new int[m];6 R( s7 m8 a6 K: r: j
        //初始长度,以后出圈一个,长度就减一
6 g7 L: c& A/ h        int len=m;) ?& r' K$ S& s9 d* J& S
        //给数组赋值; ~! v4 ^5 B. P2 y$ S  R$ T
        for(int i=0;i<a.length;i++)& q. u! L; {  H) m
            a[i]=i+1;- j6 w: P( s5 C% @2 {, l3 R6 o: B1 ~
        //i为元素下表,j代表当前要报的数6 a: V* [* _( Y
        int i=0;
1 J5 w" N0 y( |- g; ]6 E        int j=1;( R9 s. x1 T1 n6 E( m! |
        while(len>0){* L5 T6 W" L  Z, m* I! C
            if(a[i%m]>0){
2 ]1 i' S3 g" i) S, _- w                if(j%n==0){//找到要出圈的人,并把圈中人数减一" ^0 M* A& Q/ v2 O: v  b+ T; ^# }6 q
                    System.out.print(a[i%m]+"  ");5 f( `' v% V- O0 I
                    a[i%m]=-1;1 W7 D7 M. b' v2 {" `( X# ]: G% Z
                    j=1;
1 {9 L: M2 d& F3 Z                    i++;
: ?+ \8 L) ]7 q/ I9 A4 }1 }                    len--;
1 q: m3 K1 ^' b3 `9 m                }else{
: h1 C3 `4 _( \: z/ g                    i++;& Q/ V3 Q; F. A' x' y$ R2 k
                    j++;
  J! _9 U! w8 q5 s. A, R# }/ H                }
# [$ m- v1 t0 m( J; e0 a            }else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数& V& j0 I0 z* ~- }; Q
                i++;7 ?  y: i' q: r( q
            }" f. I* @7 h5 @: j# N% A
        }4 _) _; v( D0 n
    }
& }. a6 A3 k5 d6 w}. A, o) B0 k  y7 z
3 {& P' u# s' D7 r4 [
  r/ ^$ [+ T. A6 ?/ C) s6 U: {

科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

1

主题

3

听众

341

金钱

四袋长老

该用户从未签到

沙发
发表于 2016-03-17 22:08:20 |只看该作者
学习一下。谢谢
回复

使用道具 举报

woniu 实名认证   

2

主题

0

听众

330

金钱

四袋长老

该用户从未签到

板凳
发表于 2016-04-12 11:39:10 |只看该作者
这个项目太棒勒!下下来学习下!
回复

使用道具 举报

1

主题

0

听众

81

金钱

三袋弟子

该用户从未签到

地板
发表于 2016-11-01 15:48:08 |只看该作者
若m个人以1到m编号,剩余人数为i;当n<=m时,首先是n至m号的人先出圈;n>i,每轮第n%i个人出圈。
0 c( H' C: G8 m) t5 Fn>i的情况下:
$ r8 r* v. o! xn除以i的商为1时,从n%i对应的序号开始每隔一位的序号出圈(n%i, n%i + 2,...,[末位序号或末位序号-1])
" d8 H4 y9 Y. {: Ln除以i的商为2时,出圈顺序同上规律...
& R) Q; ~+ d5 X6 ^int i = m;
2 v( k  X/ y# S5 JList<Integer> baselist = new ArrayList<>();
  U9 t  v4 y. U8 ]0 S6 V$ Sint[] res = new int[m];$ j" I! J6 d2 J2 n- |
for(int j = 0;j < m;j++)
- W1 F+ J. h! W* ?+ i        baselist.add(j+1);
+ g1 V1 e' {( p1 o7 S: b6 sfor(;i >= n;i--){4 D! l5 y7 D2 m3 Y8 e8 z1 y& [# _
        res[m - i] = m + n - i;
- k3 E0 A. `, ^/ }        baselist.remove((Integer)(m + n - i));$ y- v. g5 j* H
}
$ k, X" J+ e7 R+ k% a! Q3 ~while(i > 0){
1 j- o4 ]5 S  n2 T        for(int j = n%i==0? i-1: n%i -1;j < baselist.size();j++){7 N( \, p) l& X& Y# B7 k! {
                res[m - i--] = baselist.get(j);
! u9 D" D! A0 {& h# i6 n, w$ M                baselist.remove(j);  v) e, _+ ]; c( D2 o$ ~
        }4 f9 B1 g8 }5 _* u$ F0 d% Z8 c* _
}  @3 T! U1 I8 e
数组res为所求
* y' R" q: n9 E% M, D$ Z
回复

使用道具 举报

0

主题

0

听众

104

金钱

三袋弟子

该用户从未签到

5#
发表于 2017-12-20 18:33:04 |只看该作者
1111111111111
回复

使用道具 举报

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表