关于Java实现“1000个鸡蛋/苹果分装到10个篮子/箱子里,可表述1000以内任何正整数”的程序
前两天上课,车老师留了个课后作业,想考察一下我们还剩下多少Java水平。具体要求是将1000个鸡蛋分到10个箱子里,实现随机输入一个1000及以内的数字,都可以用这十个箱子来表示。一年多没碰过Java的我当时还没意识到问题的严重性,回到宿舍想破头也没想出来如何实现。后来实在没办法了,查了一下,才得知考查的是二进制,实在惭愧。我把参考的文章放在下面:1000个苹果,放到10个框里,怎么样保证任意数量的苹果都可以被表示出来
接下来我就拾人牙慧,复述一下算法思想。
1000是接近1024的数字,1024也就是2的10次方。那么用2的i次方(0<=i<10)依次装十个箱子,就可以表述1024以内所有的数字(因为1023转换为二进制是1111111111)。于是我们从小到大开始装箱子:
箱子编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
鸡蛋数目 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 489 |
因为装到第十个箱子时,前面已经装了511个鸡蛋了,那第10个箱子只能装1000-511=489个鸡蛋了。接下来我们要做的就是把用户给出的数字转换为二进制, 然后每一位对应上述编号的箱子,例如第一位就对应第一个箱子...,以此类推。
假如用户给出了数字13,转换为二进制就是 0000001101 ,那么我们只需要取出第一、三、四个箱子即可,结果是1+4+8=13。看似很完美对吗,但其实有一个大问题,就是我们第十个箱子本应该放512个鸡蛋,但最终因为数量不够放了489个鸡蛋,那么只要用户给出的数字大于等于512,转换为二进制后,第十位必然是1,本来我们要用第十个箱子里的512个鸡蛋,但现在只有489个了,差了23个,怎么办?
解决方法就是在用户输入数据后,自己先判断一下是不是小于512,如果小于512,那我们什么也不用变,因为用不到第十个箱子;如果大于512,那我们就人为把第十个箱子先取出来,默认已经使用第十个箱子了,然后把用户给出的数据-489,剩下的鸡蛋数再让他转换为二进制,剩下的就跟上面一样了。
那么基本算法思想已经叙述完了,具体就是程序实现了。由于也是初学者,代码水平实在一般,若有大佬不吝赐教,实在感激。
import java.util.*;/*1000个鸡蛋,一次性放入10个箱子中,放好后数量不能改变
要求:在1000以内随便报一个数,得出搬哪几个箱子即可完成*/public class EggAssignment {public static void splitLine() {System.out.println("—————————————————————————————————————————————————————————————————————————————————");}public static void main(String[] args) {//生成存放鸡蛋的十个盒子int[] eggBox = new int[10];//生成存放转化为二进制的数字int[] key_2 = new int[10];//生成scanner对象sc用以接收键盘输入Scanner sc = new Scanner(System.in);/*key用来接收键盘输入,sum用以累加计算取出鸡蛋的总数jugde用于判断是否让用户继续输入*/int key=0,sum=0;boolean jugde = true;//初始化数组末尾(第10个箱子)eggBox[eggBox.length-1] = 489;//用二进制初始化数组(前9个箱子)for (int i = 0; i < 9 ; i++) {eggBox[i] = (int) Math.pow(2, i);}//输出箱子里放鸡蛋的数目splitLine();for (int i = 0; i < eggBox.length; i++) {System.out.print("第"+(i+1)+"个箱子\t");}System.out.println();splitLine();for (int i = 0; i < eggBox.length; i++) {System.out.print(eggBox[i]+"个\t");}System.out.println();splitLine();/*用户交互 while循环限定用户只能输入1000及以内的数据bug:输入非整型数据会报异常处理:使用try-catch抓取异常 令用户重新回到循环输入正确数据*/System.out.print("请输入1000以内的整数:");while(jugde) {try {key = sc.nextInt();while(key>1000) {splitLine();System.out.println("输入有误,请重新输入");System.out.print("请输入1000以内的整数:");key = sc.nextInt();}jugde = false;} catch (InputMismatchException e) {splitLine();System.out.println("输入有误 请勿输入大于1000的整数及非整数!");System.out.print("请重新输入1000以内的整数:");sc = new Scanner(System.in);}}//释放Scanner类对象sc调用的资源sc.close();//除二取余法将十进制转化为二进制//分两种情况,小于512则直接取出盒子 大于512默认先取出第十个盒子 剩下的拿前9个盒子表示//小于512直接转换二进制 大于512先减去489再转换二进制if(key<512) {for (int i = 0; i < 10 ;i++) {key_2[i]=key%2;key=key/2;} }else {key=key-489;for (int i = 0; i < 9 ;i++) {key_2[i]=key%2;key=key/2;} key_2[9]=1;//默认第十个箱子被取出}//将二进制数组下标为1时 取出对应盒子的鸡蛋System.out.print("共");for (int i = 0; i < 10; i++) {if(key_2[i]==1) {System.out.print("第"+(i+1)+"个箱子 ");sum = sum + eggBox[i];}}System.out.println("被取出");System.out.println("成功取出了 "+sum+" 个鸡蛋!");}
}
程序运行结果如下:
再次感谢-Mei-的文章,给我了很大启发,不然现在还看不懂问题要求,十分感激!
关于Java实现“1000个鸡蛋/苹果分装到10个篮子/箱子里,可表述1000以内任何正整数”的程序相关推荐
- m苹果放n篮子_egg appple千万别翻译为“鸡蛋苹果”,老外听到会懵圈的
egg很熟悉,apple也很熟悉,可是egg apple就让人一脸懵了,鸡蛋苹果是啥玩意?难道中国人有番茄鸡蛋,而歪果仁喜欢鸡蛋炒苹果? 1:egg apple 是什么意思? 其实英国人眼中的茄子是 ...
- Java学习笔记:2022年1月10日
Java学习笔记:2022年1月10日 摘要:这篇笔记主要记录了学习<Java核心技术 卷一>的第四章时的一些心得,主要阐述了对象与类这一部分的内容.需要注意的是,这一章的内容需要精心 ...
- 如何在10亿个数中找到前1000大的数?
2019独角兽企业重金招聘Python工程师标准>>> 如何在10亿个数中找到前1000大的数? 定位 TopN问题 算法 排序不是最优的解决方案: 可以考虑分治法: 类似快速排序中 ...
- 苹果将投资10亿美元扩容位于美国雷诺的数据中心
援引当地媒体Reno-Gazette Journal报道,位于美国内华达州西部城雷诺(Reno)的苹果数据中心将大规模扩张.近日雷诺市政厅对该苹果扩容项目进行了讨论,该媒体记者 Anjeanette ...
- 苹果和虫子c语言编程题,虫子吃苹果:每天10分钟,锻炼少儿编程计算思维
原标题:虫子吃苹果:每天10分钟,锻炼少儿编程计算思维 我们会不断的将一些优质的少儿编程资源分享给各位家长,请大家关注坚果学院少儿编程(公众号:坚果编程),有时间可以给孩子学习下,锻炼计算思维和编程思 ...
- 苹果操作系统 leopard 10.5 (PC破解完全中文安装版,IBM X40安装成功)
苹果操作系统 leopard 10.5 (PC破解完全中文安装版,IBM X40安装成功) 由于苹果操作系统发行时并不支持PC硬件,目前网上流通的PC安装版本全为苹果爱好者自行破解. 10.5 leo ...
- VMware虚拟机中安装苹果系统MacOS 10.12 Sierra
1.下载安装虚拟机 下载VMware-workstation-full-12.5.0-4352439.exe 进行安装. 2.下载unlocker206.zip 解压后,右键以管理员身份运行win-i ...
- The Unarchiver 4.1.0版本在苹果电脑系统10.15.6上解压xcode.xip有问题
xcode.xip已经确定没有问题. The Unarchiver 4.1.0版本在苹果电脑系统10.15.6上解压xcode.xip有问题 ,显示读取内容时出现问题:数据损坏. FileZip版本1 ...
- win10 vmware苹果虚拟机(10.13High Sierra)rbenv安装cocoapods
win10 vmware苹果虚拟机(10.13High Sierra)rbenv安装cocoapods 操作系统 苹果操作系统是10.13High Sierra的,运行在vmware虚拟机上.vmwa ...
最新文章
- Go 学习笔记(66)— Go 并发同步原语(sync.Mutex、sync.RWMutex、sync.Once)
- 用Python玩转词云
- html所有页面根的对象,在django中显示来自所有用户的对象,无需登录到html页面...
- solr源码导入eclipse
- ASP.NET MVC 中删除无用视图引擎
- 贪心算法 0-1背包c语言,贪心算法0-1背包问题(算法实验代码).pdf
- 【openMV】霍夫变换---直线提取
- 盒马要造车?网友调侃:不会就搞个车轮卷蛋糕吧
- c/c++教程 - 1.7 数组 一维数组 二维数组
- matplotlib交互模式与pycharm单独Figure设置
- python微信刷屏_用python玩转微信
- html影院选座模板,html影院前台模板
- .输入一行字符串,含有数字和非数字字符以及空格等,如: df23adfd56 2343?23dgjop535 如果将其中所有连续出现的数字视为一个整数,要求统计在该字符串中共有多少个整数,并将这些数依
- 招投标概念及注意事项
- vscode缩放代码_Visual Studio Code 缩放设置
- 人脸识别相关资源大列表
- 最详细的golang + 私库(gitlab gitee) 模块开发 这一篇文章解决所有问题
- 笔记本连网DNS服务器未响应,笔记本连接不到internet,显示DNS服务器未响应,该怎么办?win7系统。...
- NTP Client Error -- ntpstat shows unsynchronised
- OCP-1Z0-053-200题-168题-528
热门文章
- 实验四 SQL语言的数据更新和视图
- 自带设备(BYOD)能用零信任框架吗?
- CSP 202112-1 序列查询 python
- 虚拟串口软件VSPD的使用
- 中国移动诺基亚联手推出智能机
- ARM惹众怒,美国芯片行业也开始抛弃它,跟随中国芯片支持新架构
- iphone照片恢复至android,绝招!如何恢复苹果/安卓手机上误删的照片,详细教程奉上!...
- 【中文】【吴恩达课后编程作业】Course 5 - 序列模型 - 第一周作业
- 蓝桥杯的c语言编译器,第九届蓝桥杯大赛个人赛省赛(软件类)C/C++ 大学B组比赛心得(还在更新)...
- ffmpeg裁剪视频画面