二鼠打洞问题


二鼠打洞问题

《九章算术》的“盈不足篇”里有一个很有意思的老鼠打洞问题。原文是这么说的:今有垣厚十尺,两鼠对穿。大鼠日一尺,小鼠亦一尺。大鼠日自倍,小鼠日自半。问:何日相逢?各穿几何?

这道题的意思是:有一堵十尺厚的墙,两只老鼠从两边向中间打洞。大老鼠第一天打一尺,小老鼠也是一尺。大老鼠每天的打洞进度是前一天的一倍,小老鼠每天的进度是前一天的一半。问它们几天可以相逢,相逢时各打了多少。

请编程求此题的解,要求使用循环来完成,不允许使用幂运算。

测试说明

输入格式
输入为 1 个整数 wall,代表墙的厚度,单位为尺。

输出格式
输出为两行,第一行输出 1 个整数,表示相遇时所需的天数。第二行输出 2 个浮点数,分别为小鼠和大鼠打洞的距离,单位为尺,保留小数点后 1 位数字。(提示:round(f,1)为浮点数 f 保留一位小数。)

示例 1
输入: 10
输出:4 1.8 8.2

示例2
输入: 2
输出:1 1 1

提示 最后一天可能不足一天便打通了

Python求解

代码如下:

"""有一堵十尺厚的墙,两只老鼠从两边向中间打洞。大老鼠第一天打洞一尺,小老鼠也是打洞一尺。
大老鼠每天的打洞进度是前一天的一倍,小老鼠每天的进度是前一天的一半。计算并输出它们几天可以相逢,
相逢时各打了多少尺。
输入格式:输入1 个整数,代表墙的厚度,单位为尺
输出格式:
第一行输出1 个整数,表示相遇时所需的天数
第二行输出2 个浮点数,分别为小鼠和大鼠打洞的距离,单位为尺,保留小数点后1 位数字。
"""
wall = int(input()) #墙壁的厚度
rat, mouse, day, time = 1, 1, 0, 1 #大鼠速度、小鼠速度、天数、当天工作时长(1表示工作一整天)
distance_of_rat, distance_of_mouse = 0, 0 #大鼠路程、小鼠的路程
while wall > 0:
    if wall-rat-mouse < 0:
        time = wall / (rat+mouse)
        break
    wall -= (rat+mouse) #剩余墙厚
    day += 1
    distance_of_rat += rat
    distance_of_mouse += mouse
    rat *= 2
    mouse /= 2
if time < 1:
    day += 1
distance_of_rat += rat*time
distance_of_mouse += mouse*time

print(day)
print(round(distance_of_mouse, 1), round(distance_of_rat, 1)) 

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华北电力大学 实 验 报 告 " " 实验名称 PROLOG语言编程练习及图搜索问题求解 课程名称 人工智能及应用 专业班级: 学生姓名: 学 号: 成 绩: 指导教师: 实验日期:2014年5月 (实验报告如打印,纸张用A4,左装订;页边距:上下2.5cm,左2.9cm, 右2.1cm;字体:宋体小四号,1.25倍行距。) 验证性、综合性实验报告应含的主要内容: 一、实验目的及要求 二、所用仪器、设备 三、实验原理 四、实验方法与步骤 五、实验结果与数据处理 六、讨论与结论(对实验现象、实验故障及处理方法、实验中存在的问题等进行分析和 讨论,对实验的进一步想法或改进意见) 七、所附实验输出的结果或数据 设计性实验报告应含的主要内容: 一、设计要求 二、选择的方案 三、所用仪器、设备 四、实验方法与步骤 五、实验结果与数据处理 六、结论(依据"设计要求") 七、所附实验输出的结果或数据 "一、实验目的及要求 " "熟悉PROLOG的运行环境,进行PROLOG的基本编程练习。 " "了解PROLOG语言中常量、变量的表示方法。PROLOG的简单程序结构,掌握分析问题" "、询问解释技巧;进行事实库、规则库的编写,并在此基础上进行简单的询问。 " "具体实验课上相关内容,练习example1到example6的内容。 " "图搜索问题求解。 " "任选以下实际应用题目:爱因斯坦的超级问题、字谜问题、汉诺塔问题、八数码问" "题、八皇后问题、农夫过河问题、传教士野人问题等,选两个。 " "要求实验报告中包括:程序分析、运行结果、实验收获、难点重点分析等。 " "二、所用仪器、设备 " "PC机和trinc prolog编译软件。 " "三、实验原理 " "PROLOG语言是一种以逻辑推理为基础的逻辑型程序设计语言,是一种陈述性语言而" "不是过程性语言。PROLOG语言能够自动实现模式匹配和回溯、具备递归技术,而且" "语法简明,可以简化复杂问题求解。 " "1、prolog本身自带推理机,其回溯、递归技术和表处理技术可简化复杂问题求解 " "。 " "2、trinic prolog的跟踪、设断点对于调试程序是非常有用的。 " "四、实验方法与步骤 " "说明用实例如何观察并理解回溯机制 " "回溯机制所谓回溯, 就是在程序运行期间, 当某一个子目标不能满足(即谓词匹配 " "失败)时,控制就返回到前一个已经满足的子目标(如果存在的话), " "并撤消其有关变量的约束值, 然后再使其重新满足。成功后, " "再继续满足原子目标。如果失败的子目标前再无子目标, " "则控制就返回到该子目标的上一级目标(即该子目标谓词所在规则的头部)使它重新" "匹配。回溯是PROLOG的一个重要机制。 " "例如:农夫过河问题的move(...),其对应有四个子目标。当某个子目标不成立时 " ",就会回溯到前一个子目标,撤销原约束值,然后重新合一。 " "如何用断点、跟踪以及显示调试prolog程序 " "将鼠标移动至语句之前单击便打入了断点。编译了以后,如果点"Prove"这个按钮 " ",则程序运行到断处。 " "点"Trace on"这个按钮便进入单步运行状态,即跟踪状态。点击"Start " "step"开始单步运行程序。 " "知道了如何单步运行与打断点,很容易就可以对prolog程序进行调试。 " "注:说明实验的操作过程。 " "五、求解的问题与程序 " "注:说明所选择实验题目,问题分析过程和程序难点分析等。 " "1.险洞探险问题: " "Treasure-route代码: " "go(Start,Goal):- " "route(Start,Goal,[Start],VisitedL), " "reverse(VisitedL,[],RVisitedL), " "write("One route is:"), " "write(RVisitedL),nl,nl, " "fail. " "go(_,_). " "neighbor(X,Y):- " "gallery(X,Y). " "neighbor(X,Y):- " "gallery(Y,X). " "gallery(entry,fountain). " "gallery(entry,monsters). " "gallery(monsters,goldtreasure). " "gallery(goldtreasure,food). " "gallery(food,fountain). " "gallery(goldtreasure,robbers). " "gallery(goldtreasure,exit). " "gallery(fountain,mermaid). " "
学生课程设计报告 学年学期: 2017 -2017学年 春秋学期 课程名称: 智能终端软件开发 作品名称: 打地鼠 学生学院: XXXXXX 专业班级: XXXXXXXXXXX 学生学号: XXXXXXXXXXX 学生姓名: XXXXXXX 联系电话: XXXXXXXX 选题目的及意义 现在的社会娱乐方式数不胜数,其中游戏肯定是一大主角,各种类型的游戏深受人 们的喜爱。现如今,电子游戏已慢慢渗透进人们生活中,并在扮演着越来越重要的角色 。可以说,随着他的迅猛发展,现今的电子游戏已经不仅仅是一种娱乐,而是形成了一 种文化现象,具有很强的民族性和丰富的文化内涵。伴随着游戏软件在市场的销售,与 其相关的文化也随之传播。 打地鼠游戏是一款非常有趣的敏捷类游戏,适用于生活休闲,训练敏捷速度。容易 ,简单但是又好玩的游戏,是一些小孩、儿童的最爱。 二、作品概述 这款打地鼠的游戏比较简单,功能没有网上发布的那些功能齐全。一开始有20HP, 一次性出现一只或者两只地鼠,如果出现的地鼠在回到地下之前没有被打中,或者没有 打完那么减少一点HP。如果全部打中的话那么不会减少HP,进度条会记录打中的次数, 每打中一次进度就会加一。当进度到一百的时候游戏就会结束,并显示游戏结束,点击 开始新游戏的提示。 三、功能设计 1.界面的初始化 2.地鼠出洞时候的效果 3.地鼠被打后的效果 4.血量提醒 5.进度提醒 6.随机出现地鼠(1-2个) 四、详细设计 1.接口,用来初始化界面 package com.cosina.game.kickkick; public interface Constants { int COLUMN_COUNT = 3; int ROW_COUNT = 4; int HOLE_COUNT = COLUMN_COUNT * ROW_COUNT; int internel = 2000; String KEY = "key"; int TILE_SIZE = 80; } 2.地鼠出洞的效果 alues.put(new Integer(13), loadBallView(resources,R.drawable.show1)); values.put(new Integer(12), loadBallView(resources,R.drawable.show2)); values.put(new Integer(11), loadBallView(resources,R.drawable.show3)); values.put(new Integer(10), loadBallView(resources,R.drawable.show4)); values.put(new Integer(9), loadBallView(resources,R.drawable.show5)); values.put(new Integer(8), loadBallView(resources,R.drawable.show6)); values.put(new Integer(7), loadBallView(resources,R.drawable.show6)); values.put(new Integer(6), loadBallView(resources,R.drawable.show6)); values.put(new Integer(5), loadBallView(resources,R.drawable.show5)); values.put(new Integer(4), loadBallView(resources,R.drawable.show4)); values.put(new Integer(3), loadBallView(resources,R.drawable.show3)); values.put(new Integer(2), loadBallView(resources,R.drawable.show2)); values.put(new Integer(1), loadBallView(resources,R.drawable.show1)); values.put(new Integer(0), loadBallView(resources,R.drawable.emptyhole)); 游戏结束界面显示 private void doGameOver() {//游戏结束方法 AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle("Game Over"); builder.setM
学生课程设计报告 学年学期: 2017 -2017学年 春秋学期 课程名称: 智能终端软件开发 作品名称: 打地鼠 学生学院: XXXXXX 专业班级: XXXXXXXXXXX 学生学号: XXXXXXXXXXX 学生姓名: XXXXXXX 联系电话: XXXXXXXX 选题目的及意义 现在的社会娱乐方式数不胜数,其中游戏肯定是一大主角,各种类型的游戏深受人 们的喜爱。现如今,电子游戏已慢慢渗透进人们生活中,并在扮演着越来越重要的角色 。可以说,随着他的迅猛发展,现今的电子游戏已经不仅仅是一种娱乐,而是形成了一 种文化现象,具有很强的民族性和丰富的文化内涵。伴随着游戏软件在市场的销售,与 其相关的文化也随之传播。 打地鼠游戏是一款非常有趣的敏捷类游戏,适用于生活休闲,训练敏捷速度。容易 ,简单但是又好玩的游戏,是一些小孩、儿童的最爱。 二、作品概述 这款打地鼠的游戏比较简单,功能没有网上发布的那些功能齐全。一开始有20HP, 一次性出现一只或者两只地鼠,如果出现的地鼠在回到地下之前没有被打中,或者没有 打完那么减少一点HP。如果全部打中的话那么不会减少HP,进度条会记录打中的次数, 每打中一次进度就会加一。当进度到一百的时候游戏就会结束,并显示游戏结束,点击 开始新游戏的提示。 三、功能设计 1.界面的初始化 2.地鼠出洞时候的效果 3.地鼠被打后的效果 4.血量提醒 5.进度提醒 6.随机出现地鼠(1-2个) 四、详细设计 1.接口,用来初始化界面 package com.cosina.game.kickkick; public interface Constants { int COLUMN_COUNT = 3; int ROW_COUNT = 4; int HOLE_COUNT = COLUMN_COUNT * ROW_COUNT; int internel = 2000; String KEY = "key"; int TILE_SIZE = 80; } 2.地鼠出洞的效果 alues.put(new Integer(13), loadBallView(resources,R.drawable.show1)); values.put(new Integer(12), loadBallView(resources,R.drawable.show2)); values.put(new Integer(11), loadBallView(resources,R.drawable.show3)); values.put(new Integer(10), loadBallView(resources,R.drawable.show4)); values.put(new Integer(9), loadBallView(resources,R.drawable.show5)); values.put(new Integer(8), loadBallView(resources,R.drawable.show6)); values.put(new Integer(7), loadBallView(resources,R.drawable.show6)); values.put(new Integer(6), loadBallView(resources,R.drawable.show6)); values.put(new Integer(5), loadBallView(resources,R.drawable.show5)); values.put(new Integer(4), loadBallView(resources,R.drawable.show4)); values.put(new Integer(3), loadBallView(resources,R.drawable.show3)); values.put(new Integer(2), loadBallView(resources,R.drawable.show2)); values.put(new Integer(1), loadBallView(resources,R.drawable.show1)); values.put(new Integer(0), loadBallView(resources,R.drawable.emptyhole)); 游戏结束界面显示 private void doGameOver() {//游戏结束方法 AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle("Game Over"); builder.setM
基于8086/8088的打地鼠游戏系统 要求使用三个以上的接口芯片或其他元件组成相应的电路,实现某一功能电路,并编制相应的程序,调试运行最终达到设计要求。 本实验设计的是一个打地鼠游戏。地鼠通过LED灯显示。按MON键开始游戏,共分为三关,三关地鼠出现的时间间隔分别为3秒、2秒和1秒。每关有20秒,使用8279外接键盘击打地鼠,打中分数加一并由喇叭发出音效。 本实验用到芯片有74LS393、8253、8255、8259和8279等。外设有LED灯、喇叭、6位七段数码管和外接键盘等。 74LS393是分频单元,将8MHz的频率分频。本实验中使用到31250Hz。 8253为定时/计数器。本实验使用通道0产生1秒的脉冲信号用于触发中断,使用通道1产生伪随机数,从而使地鼠从不同位置出现。 8255是并行I/O接口。本实验中通过8255控制地鼠(LED灯)的显示和喇叭的音效。 8259是中断控制器。本实验使用IR0,由8253通道0触发并转中断服务程序。 8279是键盘控制器。本实验使用外接功能,由键盘控制地鼠的击打以及游戏的开始,并使用数码管显示倒计时以及当前分数。 实验中的地鼠出现的位置是由伪随机数控制的。伪随机数由8253通道1的当前计数值产生。用当前计数值除以常数得余数,即可获得随机数,查表可得当前地鼠位置。 8253的通道0和通道1都工作在方式三,16位二进制计数,通道0的计数初值为31250,配合74LS393分出的31250Hz,可以发出1Hz的脉冲,用于触发中断。通道1的计数初值为7,等于地鼠的洞数,用于产生随机数。 8255的AB口都用于输出,A口输出地鼠的位置,B口控制喇叭。 8259边沿触发,单片方式,设定IR0的中断类型为08H,一般全嵌套方式,一般EOI方式,允许IR0中断。 8279为读写模式,8位,左入口,编码,双键锁定,时钟分频,用于显示数码管以及键盘的读入。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值