题目是这样(没什么注释):

数三退一问题是:

有一圈(500人)孩子,手拉手围成一个圈,从第一个孩子开始数1,第二个孩子数2,第三个孩子数3,这时候数3的孩子退出,从下一个孩子开始数1,一直循环,直到最后剩下一个孩子,问这个孩子的位置?

加1主要是因为编号是从 1 开始的,而不是从 0 开始的,因为求出的结果是数组中的下标

第一种解法(for循环):

public void result(){int sum = 0;for (int i = 2; i <= 500; i++) {sum = (sum + 3) % i;}System.out.println(sum + 1);   //输出剩下的那个人的位置
}
// 递归方式
public int f(int n, int m) {if(n == 1)   return n;return (f(n - 1, m) + m - 1) % n + 1;
}

第二种解法(使用集合):

public static void yuesefu(int totalNum, int countNum, int startNO) {// 初始化人数List<Integer> start = new ArrayList<Integer>();for (int i = 1; i <= totalNum; i++) {start.add(i);}// 从下标为K开始计数int k = startNO - 1;while (start.size() > 0) {System.out.println(start);// 第m人的索引位置k = (k + countNum) % (start.size()) - 1;// 判断是否到队尾 到队尾时候k=-1if (k < 0) {System.out.println(start.get(start.size() - 1));start.remove(start.size() - 1);k = 0;} else {System.out.println(start.get(k));start.remove(k);}}}public static void main(String[] args){yuesefu(500, 3, 1);
}

第三种解法(使用数组):

    public void result2(){boolean[] kids;    kids = new boolean[500];    //声明一个500人的数组for (int i = 0; i < kids.length; i++) {kids[i] = true;}int leftNum = kids.length;int countNum = 0;int index = 0;while (leftNum > 1) {if (kids[index]) {countNum++;}if (countNum == 3) {kids[index] = false;countNum = 0;leftNum--;}index++;if (index == 500) {index = 0;}}for (int i = 0; i < kids.length; i++) {if (kids[i]) {System.out.println(i+1);}}}

第四种解法(使用面向对象方法):

public static void main(String[] args) {// 数3退1;每数到3就退出一个,面向对象的方法// 面向对象,考虑问题中出现的名词:小孩类,圈类KidCircle kc = new KidCircle(500);Kid k = kc.first;// 先取出kc的第一个孩子int countNum = 0;// 用来数数,数到3退出while (kc.count > 1) {countNum++;if (countNum == 3) {countNum = 0;kc.delete(k);}k = k.right;// 因为是圆环,所以,每次取k孩子的右孩子}System.out.println("剩余的小孩的编号为:" + (kc.first.id+1));}}// 小孩类
class Kid {int id;// 小孩原始编号/** 每个小孩都有左小孩和右相邻小孩*/Kid left;Kid right;
}// 圈类
class KidCircle {int count = 0;// 小孩编号Kid first;// 圈中第一个小孩Kid last;// 圈中最后一个小孩/** 写完成员变量以后首先完成其构造方法*/public KidCircle(int n)// 构造方法一般用来初始化{// 构造n个小孩的圈for (int i = 0; i < n; i++) {add();}}// 向圈中添加小孩void add() {Kid k = new Kid();k.id = count;if (count <= 0) // 当前圈中没有小孩{first = k;last = k;k.left = k;k.right = k;} else // 当前圈中有小孩情况{last.right = k;k.left = last;k.right = first;first.left = k;last = k;}count++;}// 向圈中删除小孩void delete(Kid k) {if (count <= 0)return;else if (count == 1) // 这个地方为什么{first = last = null;} else {k.left.right = k.right;k.right.left = k.left;if (k == first) // 当要删除小孩为第一个小孩时first = k.right;else if (k == last) {last = k.left;}}count--;}
代码运行结果:436

约瑟夫环(数三退一)相关推荐

  1. Java数三退一问题代码_数三退一问题算法(Java)

    数三退一问题是,有一圈孩子,手拉手围成一个圈,从第一个孩子开始数1,第二个孩子数2,第三个孩子数3,这时候数3的孩子退出,从下一个孩子开始数1,一直循环,直到最后剩下一个孩子,问这个孩子的位置? 两种 ...

  2. 约瑟夫环c语言单链表的解题思路,太透彻了:约瑟夫环的三种解法

    [CSDN 编者按]极大概率出现在面试中的约瑟夫环问题来啦,本文三种方法描述解题思路,这样讲解绝对让面试官眼前一亮. 作者 | bigsai 责编 | 欧阳姝黎 前言 约瑟夫环问题是算法中相当经典的一 ...

  3. 数三退一问题||拉手成圈出圈问题

    问题分析 一,问题描述 500个人围成一圈 ,从第一个人开始数数,第一个人数1 第二个人数2 第三个人数3 ,数到3的人退出圈子,第四个人重新开始数数 ,第四个数1 ,第五个2 ,第六个 3(退出圈子 ...

  4. 约瑟夫环问题 —— 算法

    约瑟夫环问题 前言 约瑟夫环问题一 约瑟夫环问题二 约瑟夫环问题三 约瑟夫环问题四 约瑟夫环问题五 约瑟夫环问题六 约瑟夫环问题七 约瑟夫环问题解决一 -- 模拟队列 约瑟夫环问题解决二 -- 环形链 ...

  5. 【C++】约瑟夫环问题:任给正整数n和k,按下述方法可以得到1,2, …n的一个置换:将数字1,2,…,n环形排列,按顺时针方向自1开始报数,报到K时输出该位置上的数字,并使其出列。

    题目分析 约瑟夫环问题:任给正整数n和k,按下述方法可以得到1,2, -n的一个置换:将数字1,2,-,n环形排列,按顺时针方向自1开始报数,报到K时输出该位置上的数字,并使其出列.然后从他在顺时针方 ...

  6. 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序(约瑟夫环问题)

    用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出.写出C程序 // 用户输入M,N值,从1至N开始顺序 // 循环数数,每数到M输出该数值, // 直至全部输出 #incl ...

  7. 数据结构实验报告三:教材3.10Josephus(约瑟夫环)问题、多项式乘法问题的求解

    实验三:教材3.10Josephus(约瑟夫环)问题.多项式乘法问题的求解 问题一·教材3.10Josephus问题 1.实验描述 N个人从1到N编号,围坐成一个圆圈.从1号开始传递一个热土豆.经过M ...

  8. 【苦练基本功1】三种方法实现约瑟夫环问题

    1.约瑟夫环问题描述 有n个人围城一圈,按顺序编号,从第一个人开始报数,从1报到m,凡报到m的人退出圈子,然后接着报数,问最后留下来的是原来的第几号的那位? 2.数组实现 用长度为n的数组存储人的编号 ...

  9. 无聊闲做,从使用PHP数组实现约瑟夫环问题谈性能

    闲来无事,看到园子里的一篇文章约瑟夫环问题的 PHP 实现--使用 PHP 数组内部指针操作函数,以前没有搞过,也没有听说什么什么环的,所以突然也想搞一下试试 问题大概这样子:一群猴子排成一圈,按 1 ...

最新文章

  1. 常考数据结构和算法:链表中环的入口节点
  2. 移动重定位表到新增节
  3. Java代码的编译与反编译那些事儿
  4. Mybaits之Mapper动态代理开发
  5. 六逻辑层次 职业规划案例_我如何在六个月内改变职业并找到了一名开发人员...
  6. 启动hive报错_远程服务器模式Hive的搭建过程详解
  7. 【转载】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型...
  8. Chrome的两个工具
  9. python数据清洗 - Numpy库
  10. 影视观影神器:ZY Player for Mac使用教程
  11. 注销 睡眠 休眠的区别
  12. SQL Server-【知识与实战III】年龄查询、条件查询、多表查询、姓氏查询
  13. 关于Chrome的广告和弹窗拦截插件
  14. Spring框架总结(8)
  15. 把ipad变成电脑的外接显示屏
  16. 梅州通风柜设计安装那些事
  17. 混凝土骨料微观结构数学物理模型建模
  18. C# 右键菜单注册表改写
  19. 音频增强工具:DeskFX Plus Mac
  20. C语言结构体大小计算

热门文章

  1. 微信小程序修改标题背景色
  2. IoT嵌入式硬件--DC/DC
  3. 公务员行测常识积累(持续更新中)
  4. PID积分饱和 和 积分分离
  5. 2021.12.21报错解决:jquery.min.js:5 POST http://localhost:3000/login 400 (Bad Request)
  6. 华为在鸿蒙的另一张王牌,麒麟芯成绝唱后,华为终于还是,甩出了另外一张王牌...
  7. IBM车库创新:为科技创新头号工程打造共创引擎
  8. 第二章 数据查询语言DQL
  9. 微信公众号普通消息接收接口
  10. 华尔街风雨飘摇 甲骨文却展翅翱翔