`
linshouyi
  • 浏览: 20595 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

经典的数3退1问题

阅读更多

上网看了很多解决该问题的思路是面向过程的,用java写了个面向对象的,其实这就是一个循环的双向链表结构。

就一个kid类模拟小朋友,属性:id,左手拉的小孩,右手拉的小孩。行为:数数字和退出。代码如下:

传统面向过程思想:

import java.util.ArrayList;
import java.util.List;

public class Count3exit1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		List<Integer> list = new ArrayList<Integer>();

		for (int i = 0; i < 500; i++) {
			int id = i + 1;
			list.add(id);
		}
		int count = 0;
		while (!list.isEmpty()) {
			for (int i = 0; i < list.size(); i++) {
				count++;
				if (count == 3) {
					System.out.println("可怜的小朋友:" + list.remove(i));
					i--;
					count = 0;
				}
			}
		}
	}
}

 

面向对象思想:

import java.util.ArrayList;
import java.util.List;

/**
 * 小朋友
 * 
 * @author Administrator
 * 
 */
public class Kid {

	public int id;// 小朋友id
	public Kid left;// 小朋友左收拉的小朋友
	public Kid right;// 小朋友右手拉的小朋友

	public Kid(int id) {
		this.id = id;
	}

	/**
	 * 小朋友数数字,数到3的倍数就退出,
	 * 
	 * @param number
	 *            小朋友数的数字
	 * @return 左手拉自己,右手也拉自己的小朋友(即最后一个小朋友)
	 */
	public Kid count(int number) {
		if (left == this && right == this) {
			return this;
		}
		if (number % 3 == 0) {
			System.out.println("可怜的小朋友:" + id);
			this.exit();
		}
		number++;// 数的数字加1
		/**
		 * 下一个小朋友接着数数字
		 */
		return this.right.count(number);
	}

	/**
	 * 小朋友退出,并将左右手的小朋友互相拉手
	 */
	public void exit() {
		this.left.right = this.right;
		this.right.left = this.left;
	}

	public static void main(String[] args) {
		/**
		 * 找齐500个小朋友
		 */
		List<Kid> kids = new ArrayList<Kid>();
		for (int i = 0; i < 600; i++) {
			int id = i + 1;
			kids.add(new Kid(id));
		}
		/**
		 * 所有小朋友围成一圈拉好手
		 */
		for (int i = 0; i < kids.size(); i++) {
			if (i == 0) {
				kids.get(i).left = kids.get(kids.size() - 1);
			} else {
				kids.get(i).left = kids.get(i - 1);
			}
			if (i == kids.size() - 1) {
				kids.get(i).right = kids.get(0);
			} else {
				kids.get(i).right = kids.get(i + 1);
			}
		}
		/**
		 * 从1个小朋友开始数1
		 */
		Kid lastKid = kids.get(0).count(1);

		System.out.println("最后一个小朋友:" + lastKid.id);
	}
}

 

 

分享到:
评论

相关推荐

    java 数三退一程序

    数三退一,双向链表,Count1Quti2

    约瑟夫退圈问题

    N个人围成一圈,从第一个人开始按顺序报数并编号1,2,3,……N,然后开始从第一个人转圈报数,凡是报到3的退出圈子。则剩下的最后一个人编号是多少。 定义一个类,然后在类前定义一个结构体  2、在类中定义一个链表...

    java 数三退一源代码

    这个是用JAVA实现的数三退一的源代码,是用双链表实现的,不知道对大家有没有用,可以看看,对于大学里老师可能会让人做这样的题目,可能看对大家有帮助哦

    C++学习测试程序(数三退一)

    vs环境下实现计算字符串的大小、字符串连接(两种方法)、字符串的比较、计算子串的数目、模板匹配,如str 传入字符ABCDE,arr 传入30124,则输出DABCE;单项循环链表实现数3退1 。以上均在VS下编程测试通过。

    java经典编程题

    17.有n个人围成一个圈子,从第一个人开始报数,报到3的退下,问最后留下的是编号为几的人; 18.字符串排序; 19.海滩上有一堆桃子,五只猴子来分,第一只猴子均分成5份,多出一个,扔进海里,自己拿走一份,第二三四...

    C++程序设计.doc

    实现提示:西瓜类中,设计3个数据成员(重量weight、总重量total_weiht、总个数 total_number)。因为不论西瓜是否存在,总重量total_weiht和总个数total_number这 两个数据总是要保留的,因此这两个数据要申明为...

    自动售货机_数电课设_售货机_

    (1)设自动售货机能销售3种商品,矿泉水、热狗和汉堡,它们的单价分别是1元、4元和8元。(2)自动售货机允许投入1元、2元和5元纸币。(3)购买商品时,首先按下要购买商品额对应按键,商品对应的灯亮。然后投入钱币...

    自动售货机控制系统的设计

    设计一个简易的自动售货机,它能够完成钱数处理、找零、显示、退币等功能。 (1)用3个键表示3种钱,再用3个键表示3种物品。 (2)用2个数码管显示输入的钱数,再用2个数码管显示所找的钱数,以元为单位。 (3)买...

    量子信息论.pdf

    新的发展解决了一系列基础问题,如纠错问题、量子密码及有关的量子非克隆定理、量子远程传态、退相干的避免或减小等问题。新的算法也不断涌现。量子信息学的进一步发展大大丰富了量子力学纠缠态的理论,使量子信息可...

    2010年全国研究生考试计算机统考真题 word文档格式

    2010年全国研究生考试计算机统考真题一、单选题 ...5、在一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶节点个数是() A:41 B:82 C:113 D:122

    捕鱼机打码图文教材

    1.3即中即退选择~按键退币,按键退彩票,即中即退币,即中即退彩票 1.4机型选择:立式3人,立式四人,卧式4.6.8.10人 1.5加炮幅度:1~9900~建议10 1.6最小炮数:1~9900建议10=1毛钱 1.7最大炮数:50~9900建议1000分=10元 5000...

    用栈来对一位数的四则运算表达式计算结果

    1.读入字符/数字--〉字符/数字进栈 2.根据算符优先级,退出两个字符/数字,用运算符计算结果,并将结果进栈 3.栈能刚好退完,则最后的即为结果。否则表明表达式求值的程序有误。

    人工智能作业(局部搜索-八皇后问题)

    1. 实现贪心局部搜索、随机局部搜索、侧向移动局部搜索算法、模拟退 火算法。 第一章 局部搜索-八皇后问题 8 2. 统计上述算法在八皇后问题上成功求解的次数,成功求解时的平均迭 代步数,进行比较分析。 3. 绘制并...

    数据结构实验 排序数基本操作

    3、加深对二叉树的理解,逐步培养解决实际问题的编程能力 一)基础题 1、编写二叉排序树的基本操作函数 (1)SearchNode( TREE *tree, int key,TREE **pkpt,TREE **kpt ) 查找结点函数; (2)InsertNode( TREE ...

    数字逻辑电路设计自动售卖机

    为一家热狗食品公司设计一个自动出售热狗的系统,使其能在购物中心提供售卖服务。项目要求: 1. 运用传感器模拟投币信号,并将信号...3. 实现自动扣费,并能退付相应金额。 4. 交易完成后,数字系统能自动复位清零。

    实验二表达式求值.zip

    同时将操作数栈opnd退栈两次,得到两个操作数b、a,对a、b进行ab运算后,将运算结果作为中间结果推入opnd栈。 c.若栈顶运算符的优先级与刚读入的运算符c相同,说明左右括号相遇,只需将栈顶运算符(左括号)退栈...

    1.基于51单片机的数码录音放音系统设计(实物).rar

    1.录音;2.播放与停止;3.播放选择;4.快进快退;5.删除;6.显示相关信息。 当接通电源后,需要按下自锁开关才能使系统上电,随即LCD1602会显示录音条目选择界面。 按键开关从左至右(S0-S4)功能分别为S0-...

    Android MP3播放器 (简单练习版)

    1、 读取并保存SD卡所有的MP3文件和LRC歌词文件,解析LRC文件读取歌词内容; 2、 在歌曲列表中显示歌曲名字,歌手名字,歌手头像; 3、 歌手的头像是我自己网上下载的几十位比较出名的歌手头像; 4、 在播放页面,最...

Global site tag (gtag.js) - Google Analytics