设计一个一百亿的计算器

.补码(负数在计算机中的存储)

.百亿计算器

负数在计算机中以补码的形式存储。负数的补码表示方法是:将负数表示成二进制原码(负数最高位是1,正数最高位是0)然后将原码取反(1变0,0变1),即反码,将反码加1(最后一位上加1),即转化为补码。如用八位二进制表示-5,第一步,原码10000101,反码01111010,加1变为补码:01111011

首先要明白这道题目的考查点是什么,一是大家首先要对计算机原理的底层细节要清楚、要知道加减法的位运算原理和知道计算机中的算术运算会发生越界的情况,二是要具备一定的面向对象的设计思想。

首先,计算机中用固定数量的几个字节来存储的数值,所以计算机中能够表示的数值是有一定的范围的,为了便于讲解和理解,我们先以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亿的大小,所以,要实现一个一百亿的计算器,我们得自己设计一个类可以用于表示很大的整数,并且提供了与另外一个整数进行加减乘除的功能,大概功能如下:

(1)这个类内部有两个成员变量,一个表示符号,另一个用字节数组表示数值的二进制数

(2)有一个构造方法,把一个包含有多位数值的字符串转换到内部的符号和字节数组中

(3)提供加减乘除的功能

public class BigInteger{

int sign;

byte[] val;

public Biginteger(String val) {

sign = ;

val = ;

}

public BigInteger add(BigInteger other)       {

}

public BigInteger subtract(BigInteger other) {

}

public BigInteger multiply(BigInteger other){

}

public BigInteger divide(BigInteger other){

}

}

备注:要想写出这个类的完整代码,是非常复杂的,如果有兴趣的话,可以参看jdk中自带的java.math.BigInteger类的源码。面试的人也知道谁都不可能在短时间内写出这个类的完整代码的,他要的是你是否有这方面的概念和意识,他最重要的还是考查你的能力,所以,你不要因为自己无法写出完整的最终结果就放弃答这道题,你要做的就是你比别人写得多,证明你比别人强,你有这方面的思想意识就可以了,毕竟别人可能连题目的意思都看不懂,什么都没写,你要敢于答这道题,即使只答了一部分,那也与那些什么都不懂的人区别出来,拉开了距离,算是矮子中的高个,机会当然就属于你了。另外,答案中的框架代码也很重要,体现了一些面向对象设计的功底,特别是其中的方法命名很专业,用的英文单词很精准,这也是能力、经验、专业性、英语水平等多个方面的体现,会给人留下很好的印象,在编程能力和其他方面条件差不多的情况下,英语好除了可以使你获得更多机会外,薪水可以高出一千元。

时间: 2024-09-30 00:25:21

设计一个一百亿的计算器的相关文章

objective-c 一个链式加法计算器实现

一个链式加法计算器实现思路 1.使用时的效果 Calculate * manger=[Calculate new]; int result=manger.add(123).add(123).sub(123).result; 输出结果为:result:123 2.实现方法 新建Calculate类: 添加一个属性@property(nonatomic,assign) int result,作为计算结果: 因为使用的方式为 result=manger.add(123).add(123).sub(12

java设计之简单的JAVA计算器

做这个东西主要是为了练习一下以前学习过的java Swing,所以那些复杂的算法就没有加载到里面去........ 先展示一下效果....,额,当然不是这个样子....   ---> 代码: 1 package dialog_color; 2 3 import java.awt.BorderLayout; 4 import java.awt.Color; 5 import java.awt.Container; 6 import java.awt.FlowLayout; 7 import jav

类实现一个简单的日期计算器

作为一个程序员,对于时间的概念已经退化到了三岁小孩水平,常常会醉心于写一个程序忘记了时间,一个下午,一天,甚至一个星期就过去了.对于一个刚入程序员大门的我来说,时光真的是匆匆溜走,所以经常会百度一个日期计数器,算今天到那些特别的日子还有多少天.用多了后就觉得现在储备的编程知识可以去实现一个简单的日期计算器了.所以就写了这篇博客给大家分享一下. 首先,得设计这个日期类,一个日期类应该具有私有数据成员应该有年Year,月month,日day.在这我们就不精确到时分秒了. #pragma once #

WebCollector内核解析—如何设计一个爬虫

本文利用WebCollector内核的解析,来描述如何设计一个网络爬虫.我们先来看看两个非常优秀爬虫的设计. Nutch Nutch由apache开源组织提供,主页:http://nutch.apache.org/ Nutch是目前最好的网络爬虫之一,Nutch分为内核和插件两个模块组成,内核控制整个爬取的逻辑,插件负责完成每个细节(与流程无关的细节)的实现.具体分工如下: 内核:控制爬虫按照 Inject -> Generator -> Fetch -> Parse -> Upd

小米上市之后,雷军的下一个千亿业务在哪?

恭喜雷军!!!小米终于上市了.7月9日,小米在港交所证实挂牌交易,开盘价16.6港元.以开盘价算,小米总市值为473.2亿美元.小米上市之后,雷军个人财富达进入全球富豪排行榜,位列第115.小米虽然破发,但长远来看,玺哥还是看好小米的.一.小米上市,不止雷军是赢家在小米上市前一天,雷军在内部公开信中表示:最近资本市场跌宕起伏,小米能够成功上市就意味着巨大的成功.雷军在公开信中回顾说,2010年4月6日,在中关村银谷大厦一间很小的办公室,一家叫小米的小公司静悄悄地开业了,到现在我都依稀记得,当时只

Java面试常问题:如何设计一个高并发系统?你该如何优雅的回答

面试原题 如何设计一个高并发系统? 面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了.为啥?因为你没看到现在很多公司招聘的 JD 里都是说啥,有高并发就经验者优先. 如果你确实有真才实学,在互联网公司里干过高并发系统,那你确实拿 offer 基本如探囊取物,没啥问题.面试官也绝对不会这样来问你,否则他就是蠢. 假设你在某知名电商公司干过高并发系统,用户上亿,一天流量几十亿,高峰期并发量上万,甚至是十万.那么人家一定会仔细盘问你的系统架构,你们系统啥架构?怎么部署的?部

Androidstudio如何制作一个高仿小米计算器小demo

Androidstudio如何制作一个高仿小米计算器小demo ————安德风 一.最终成品效果图: 二.界面设计布局源代码:文件名activity_main.xml (存放在jsj(我的模块名为jsj)/res/layout/activity_main.xml) 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.a

Android 设计一个菱形形状的Imageview组件.

网上没有资料,特来请教下大神 Android 设计一个菱形形状的Imageview组件. >> android 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/android/1010000007107851/Android设计一个菱形形状的Imageview组件.html

设计一个程序能够将某一个目录下面的所有文件名打印出来---File类的使用

,设计一个程序能够将某一个目录下面的所有文件名打印出来 运用到的方法有:返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录:list()           测试此抽象路径名表示的文件是否是一个目录:isDirectory()           返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件:listFiles() package printfilename; import java.io.File; public class PrintFileNam