前两天上课,车老师留了个课后作业,想考察一下我们还剩下多少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以内任何正整数”的程序相关推荐

  1. m苹果放n篮子_egg appple千万别翻译为“鸡蛋苹果”,老外听到会懵圈的

    egg很熟悉,apple也很熟悉,可是egg apple就让人一脸懵了,鸡蛋苹果是啥玩意?难道中国人有番茄鸡蛋,而歪果仁喜欢鸡蛋炒苹果? 1:egg apple 是什么意思? 其实英国人眼中的茄子是 ...

  2. Java学习笔记:2022年1月10日

    Java学习笔记:2022年1月10日 ​ 摘要:这篇笔记主要记录了学习<Java核心技术 卷一>的第四章时的一些心得,主要阐述了对象与类这一部分的内容.需要注意的是,这一章的内容需要精心 ...

  3. 如何在10亿个数中找到前1000大的数?

    2019独角兽企业重金招聘Python工程师标准>>> 如何在10亿个数中找到前1000大的数? 定位 TopN问题 算法 排序不是最优的解决方案: 可以考虑分治法: 类似快速排序中 ...

  4. 苹果将投资10亿美元扩容位于美国雷诺的数据中心

    援引当地媒体Reno-Gazette Journal报道,位于美国内华达州西部城雷诺(Reno)的苹果数据中心将大规模扩张.近日雷诺市政厅对该苹果扩容项目进行了讨论,该媒体记者 Anjeanette ...

  5. 苹果和虫子c语言编程题,虫子吃苹果:每天10分钟,锻炼少儿编程计算思维

    原标题:虫子吃苹果:每天10分钟,锻炼少儿编程计算思维 我们会不断的将一些优质的少儿编程资源分享给各位家长,请大家关注坚果学院少儿编程(公众号:坚果编程),有时间可以给孩子学习下,锻炼计算思维和编程思 ...

  6. 苹果操作系统 leopard 10.5 (PC破解完全中文安装版,IBM X40安装成功)

    苹果操作系统 leopard 10.5 (PC破解完全中文安装版,IBM X40安装成功) 由于苹果操作系统发行时并不支持PC硬件,目前网上流通的PC安装版本全为苹果爱好者自行破解. 10.5 leo ...

  7. VMware虚拟机中安装苹果系统MacOS 10.12 Sierra

    1.下载安装虚拟机 下载VMware-workstation-full-12.5.0-4352439.exe 进行安装. 2.下载unlocker206.zip 解压后,右键以管理员身份运行win-i ...

  8. The Unarchiver 4.1.0版本在苹果电脑系统10.15.6上解压xcode.xip有问题

    xcode.xip已经确定没有问题. The Unarchiver 4.1.0版本在苹果电脑系统10.15.6上解压xcode.xip有问题 ,显示读取内容时出现问题:数据损坏. FileZip版本1 ...

  9. win10 vmware苹果虚拟机(10.13High Sierra)rbenv安装cocoapods

    win10 vmware苹果虚拟机(10.13High Sierra)rbenv安装cocoapods 操作系统 苹果操作系统是10.13High Sierra的,运行在vmware虚拟机上.vmwa ...

最新文章

  1. Go 学习笔记(66)— Go 并发同步原语(sync.Mutex、sync.RWMutex、sync.Once)
  2. 用Python玩转词云
  3. html所有页面根的对象,在django中显示来自所有用户的对象,无需登录到html页面...
  4. solr源码导入eclipse
  5. ASP.NET MVC 中删除无用视图引擎
  6. 贪心算法 0-1背包c语言,贪心算法0-1背包问题(算法实验代码).pdf
  7. 【openMV】霍夫变换---直线提取
  8. 盒马要造车?网友调侃:不会就搞个车轮卷蛋糕吧
  9. c/c++教程 - 1.7 数组 一维数组 二维数组
  10. matplotlib交互模式与pycharm单独Figure设置
  11. python微信刷屏_用python玩转微信
  12. html影院选座模板,html影院前台模板
  13. .输入一行字符串,含有数字和非数字字符以及空格等,如: df23adfd56 2343?23dgjop535 如果将其中所有连续出现的数字视为一个整数,要求统计在该字符串中共有多少个整数,并将这些数依
  14. 招投标概念及注意事项
  15. vscode缩放代码_Visual Studio Code 缩放设置
  16. 人脸识别相关资源大列表
  17. 最详细的golang + 私库(gitlab gitee) 模块开发 这一篇文章解决所有问题
  18. 笔记本连网DNS服务器未响应,笔记本连接不到internet,显示DNS服务器未响应,该怎么办?win7系统。...
  19. NTP Client Error -- ntpstat shows unsynchronised
  20. OCP-1Z0-053-200题-168题-528

热门文章

  1. 实验四 SQL语言的数据更新和视图
  2. 自带设备(BYOD)能用零信任框架吗?
  3. CSP 202112-1 序列查询 python
  4. 虚拟串口软件VSPD的使用
  5. 中国移动诺基亚联手推出智能机
  6. ARM惹众怒,美国芯片行业也开始抛弃它,跟随中国芯片支持新架构
  7. iphone照片恢复至android,绝招!如何恢复苹果/安卓手机上误删的照片,详细教程奉上!...
  8. 【中文】【吴恩达课后编程作业】Course 5 - 序列模型 - 第一周作业
  9. 蓝桥杯的c语言编译器,第九届蓝桥杯大赛个人赛省赛(软件类)C/C++ 大学B组比赛心得(还在更新)...
  10. ffmpeg裁剪视频画面