开启左侧

请设计一个一百亿的计算器

[复制链接]
红筹 发表于 2011-9-2 20:15:39 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
首先要明白这道题目的考查点是什么,一是大家首先要对计算机原理的底层细节要清楚、要知道加减法的位运算原理和知道计算机中的算术运算会发生越界的情况,二是要具备一定的面向对象的设计思想。
首先,计算机中用固定数量的几个字节来存储的数值,所以计算机中能够表示的数值是有一定的范围的,为了便于讲解和理解,我们先以byte 类型的整数为例,它用1个字节进行存储,表示的最大数值范围为-128到+127。-1在内存中对应的二进制数据为11111111,如果两个-1相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,11111110,由于进位后超过了byte类型的存储空间,所以进位部分被舍弃,即最终的结果为11111110,也就是-2,这正好利用溢位的方式实现了负数的运算。-128在内存中对应的二进制数据为10000000,如果两个-128相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,00000000,由于进位后超过了byte类型的存储空间,所以进位部分被舍弃,即最终的结果为00000000,也就是0,这样的结果显然不是我们期望的,这说明计算机中的算术运算是会发生越界情况的,两个数值的运算结果不能超过计算机中的该类型的数值范围。由于Java中涉及表达式运算时的类型自动提升,我们无法用byte类型来做演示这种问题和现象的实验,大家可以用下面一个使用整数做实验的例子程序体验一下:
          int a = Integer.MAX_VALUE;
          int b = Integer.MAX_VALUE;
          int sum = a + b;
          System.out.println(“a=”+a+”,b=”+b+”,sum=”+sum);
先不考虑long类型,由于int的正数范围为2的31次方,表示的最大数值约等于2*1000*1000*1000,也就是20亿的大小,所以,要实现一个一百亿的计算器,我们得自己设计一个类可以用于表示很大的整数,并且提供了与另外一个整数进行加减乘除的功能,大概功能如下:
()这个类内部有两个成员变量,一个表示符号,另一个用字节数组表示数值的二进制数
()有一个构造方法,把一个包含有多位数值的字符串转换到内部的符号和字节数组中
()提供加减乘除的功能
public class BigInteger{
          int sign;
          byte[] val;
          public Biginteger(String val)  {
                   sign= ;
                   val= ;
          }
          public BigInteger add(BigInteger other)   {
                  
          }
          public BigInteger subtract(BigIntegerother)      {
                  
          }
          public BigInteger multiply(BigIntegerother){
                  
          }
          public BigInteger divide(BigIntegerother){
                  
          }
}
备注:要想写出这个类的完整代码,是非常复杂的,如果有兴趣的话,可以参看jdk中自带的java.math.BigInteger类的源码。面试的人也知道谁都不可能在短时间内写出这个类的完整代码的,他要的是你是否有这方面的概念和意识,他最重要的还是考查你的能力,所以,你不要因为自己无法写出完整的最终结果就放弃答这道题,你要做的就是你比别人写得多,证明你比别人强,你有这方面的思想意识就可以了,毕竟别人可能连题目的意思都看不懂,什么都没写,你要敢于答这道题,即使只答了一部分,那也与那些什么都不懂的人区别出来,拉开了距离,算是矮子中的高个,机会当然就属于你了。另外,答案中的框架代码也很重要,体现了一些面向对象设计的功底,特别是其中的方法命名很专业,用的英文单词很精准,这也是能力、经验、专业性、英语水平等多个方面的体现,会给人留下很好的印象,在编程能力和其他方面条件差不多的情况下,英语好除了可以使你获得更多机会外,薪水可以高出一千元。
做好自己!

精彩评论6

正序浏览
godfrey 发表于 2011-9-2 20:42:05 | 显示全部楼层
介个~~

点评

这个怎么了?  详情 回复 发表于 2011-9-2 21:04
欢迎大家多发帖,参与讨论,增进彼此了解。
红筹 发表于 2011-9-2 21:04:27 | 显示全部楼层
godfrey 发表于 2011-9-2 20:42
介个~~

这个怎么了?

点评

介个不错 就是偶看了头疼 偶不行了  详情 回复 发表于 2011-9-2 21:16
做好自己!
 楼主| godfrey 发表于 2011-9-2 21:16:11 | 显示全部楼层
红筹 发表于 2011-9-2 21:04
这个怎么了?

介个不错 就是偶看了头疼
偶不行了
etjyl 发表于 2011-9-2 21:59:23 | 显示全部楼层
你天天搞这个啊。。。

点评

我也没啥别的搞的啊,龍哥有啥见教。  详情 回复 发表于 2011-9-3 11:33
欢迎大家多发帖,参与讨论,增进彼此了解。
红筹 发表于 2011-9-3 11:33:02 | 显示全部楼层
etjyl 发表于 2011-9-2 21:59
你天天搞这个啊。。。

我也没啥别的搞的啊,龍哥有啥见教。
做好自己!
 楼主| 笨小孩 发表于 2012-3-19 18:57:14 | 显示全部楼层
呵呵 这个就是大整数问题嘛!软件人才大赛的常考题型之一!我只会用C解决 java才开始学
欢迎大家多发帖,参与讨论,增进彼此了解。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


0关注

4粉丝

13帖子

推荐阅读更多+
会员达人更多+
广告位

最新信息

更多+

关注我们:教育技术人

官方微信

官方微博

教育技术热线:

13955453231

学教育技术,上教育技术论坛!

教育技术论坛征稿范围:教育技术应用案例、教程文章、优秀作品等。

Email:sf@etthink.com

Copyright   ©2007-2026  应用思考-教育技术论坛  Powered by©Discuz!  技术支持:且行资源    ( 皖ICP备10014945号-4 )