【约瑟夫环】Java实现:100个人开始从1开始报数,每当报数到3,报数3的人离开,求最后留下来人的位置。

【约瑟夫环】Java实现:100个人开始从1开始报数,每当报数到3,报数3的人离开,求最后留下来人的位置。

原创  2017年03月15日 00:21:36

问题背景:约瑟夫环问题 
在这里写一个简单的约瑟夫环的问题:100个人坐成一圈开始从1开始报数,每个报数为3的人离开座位,直到座位上只剩下一个人,求这个人的位置。

解决问题使用的工具&编程语言: 
工具:Eclipse 
编程:Java

代码如下:

public class Yuesefu {
        public static void main(String[] args){
            int number=100;         //假设一共有100个人,同时也是数组容量
            int index=0;            //定义数组下标
            int say=0;              //报数

            boolean array[]=new boolean[number];//定义一个boolean类型的数组,将所有人装进去,数组元素默认为ture。
            for(int i=0;i<array.length;i++){    //当该座位的人报数为3时,将该数组元素从ture改成false。从而实现人数减1
                array[i]=true;
            }

            while(number>1){                    //当只剩一个人的时候,跳出循环
                if(array[index]){               //座位有人时报数
                    say++;                      //报数
                }
                if(say==3){                     //当报数为三时,重新开始计数,该座位的人离开,数组位置值变为false,人数减一
                    say=0;
                    array[index]=false;
                    number--;
                }
                index++;                        //数组下标加一,往后移动,继续报数
                if(index==100){                 //当数组下标等于100的时候,重新开始一圈,数组下标变为0
                    index=0;
                }
            }

            for(int i=0;i<array.length;i++){    //进行多次循环后,找出最后数组中值仍然为ture的元素
                if(array[i]){                   
                    System.out.println("剩下的是从刚开始报数之后的第"+i+"个人");
                }
            }               
        }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用函数实现约瑟夫环报数的方法如下: 首先,需要定义一个函数来解决约瑟夫环问题。函数名可以为Josephus_problem,参数为整数n,表示初始的人数。 在函数内部,我们需要动态分配一个长度为n的整型数组arr,用来表示每个人的生命值。初始时,将数组中的所有元素都赋***初始值为n;count用来进行报数,初始值为0。 然后,我们进行一个while循环,条件是tmp大于1,也就是还有超过一个人存活。 在循环中,我们使用for循环遍历数组arr,判断每个人的生命值是否为1。如果是1,则进行报数操作。 报数操作是将count加1,如果count等于3,则将该人的生命值赋为0,表示该人被淘汰。然后,tmp减1,count重置为0。 最后,在for循环外再次使用一个for循环遍历数组arr,找到生命值为1的人,返回其索引值,即为最后剩下的人。 如果遍历完整个数组都没有生命值为1的人,则返回-1,表示没有人存活。 最后,在main函数中调用Josephus_problem函数,并将人数作为参数传入。然后,将返回值打印出来,即为最后剩下的人的索引值。 使用函数实现约瑟夫环报数的完整代码如下: #include <stdio.h> #include <stdlib.h> int Josephus_problem(int n) { int* arr = (int*)malloc(n * sizeof(int)); for (int i = 0; i < n; i++) { arr[i] = 1; } int tmp = n; // 幸存人数 int count = 0; // 报的号 while (tmp > 1) { for (int i = 0; i < n; i++) { if (arr[i] == 1) { count++; if (count == 3) { arr[i] = 0; tmp--; count = 0; } } } } for (int i = 0; i < n; i++) { if (arr[i] == 1) { return i; } } return -1; } int main() { printf("%d\n", Josephus_problem(人数 - 1)); return 0; } 其中,将代码中的人数部分替换为实际的人数即可。请注意,人数应当减去1,因为数组的索引从0开始。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C语言 (编程题:约瑟夫环 报数游戏)](https://blog.csdn.net/weixin_56935264/article/details/121627282)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值