java面试题--实现一个百亿的计算器
看了网上很多说法,没有具体把它实现的,我试了一下其实还是比较简单的。
直接看代码:
package com.infomorrow; import java.math.BigInteger;
import org.junit.Test; /**
* @ClassName: test_biginteger
* @Description: 设计一个百亿计算器的回头乘除
* @author: amosli
* @email:amosli@infomorrow.com
* @date 2014年2月26日 下午12:48:51
*/
public class test_biginteger {
@Test
public void test(){
double x = Math.pow(2, 64);
BigInteger xBigInteger = BigInteger.valueOf((long) x);
double y = Math.pow(2, 64);
System.out.println("y = "+y);
BigInteger yBigInteger = BigInteger.valueOf((long) y);
System.out.println("x*y = "+multiply(xBigInteger, yBigInteger));
System.out.println("x+y = "+add(xBigInteger, yBigInteger));
System.out.println("x-y = "+subtract(xBigInteger, yBigInteger));
System.out.println("x/y = "+divide(xBigInteger, yBigInteger));
}
/*
* 加法:x+y
*/
public BigInteger add(BigInteger x,BigInteger y){
return x.add(y);
}
/*
* 减法: x-y
*/
public BigInteger subtract(BigInteger x,BigInteger y){
return x.subtract(y);
}
/*
* 乘法: x*y
*/
public BigInteger multiply(BigInteger x,BigInteger y){
return x.multiply(y);
}
/*
* 除法:x/y
*/
public BigInteger divide(BigInteger x,BigInteger y){
return x.divide(y);
}
}
输出结果:
y = 1.8446744073709552E19
x*y = 85070591730234615847396907784232501249
x+y = 18446744073709551614
x-y = 0
x/y = 1
看了上面的代码,是不是感觉很简单?
这里用到了 BigInteger这个类中的方法进行加减乘除的。
常见的数据类型:
数据类型 类型名 位长 取值范围 默认值
布尔型 boolean 1 true,false false
字节型 byte 8 -128-127 0
字符型 char 16 ‘\u000’-\uffff ‘\u0000’
短整型 short 16 -32768-32767 0
整型 int 32 -2147483648,2147483647 0
长整型 long 64 -9.22E18,9.22E18 0
浮点型 float 32 1.4E-45-3.4028E+38 0.0
双精度型 double 64 4.9E-324,1.7977E+308 0.0
这里特别要提出出的两种类型:
BigInteger 任意大的整数,原则上是,只要你的计算机的内存足够大,可以有无限位的.
BigDecimal BigDecimal的实现利用到了BigInteger, 所不同的是BigDecimal加入了小数位的概念,所以对于想要精度的同学来说用这个比较好。
BigDecimal.ROUND_UP 最后一位如果大于0,则向前进一位,正负数都如此。
BigDecimal.ROUND_DOWN 最后一位不管是什么都会被舍弃。
BigDecimal.ROUND_CEILING 如果是正数,按ROUND_UP处理,如果是负数,按照ROUND_DOWN处理。例如7.1->8; -7.1->-7;所以这种近似的结果都会>=实际值。
BigDecimal.ROUND_FLOOR 跟BigDecimal_ROUND_CEILING相反。例如7.1->7;-7.1->-8。这种处理的结果<=实际值。
BigDecimal.ROUND_HALF_DOWN 如果最后一位<=5则舍弃,如果>5, 向前进一位。如7.5->7;7.6->8;-7.5->-7
BigDecimal.ROUND_HALF_UP 如果最后一位<5则舍弃,如果>=5, 向前进一位。反之舍弃。如7.5->8;7.4->7;-7.5->-8
BigDecimal.ROUND_HALF_EVEN 如果倒数第二位是奇数,按照BigDecimal.ROUND_HALF_UP处理,如果是偶数,按照 BigDecimal.ROUND_HALF_DOWN来处理。如7.5->8;8.5->8;7.4->7;-7.5->-8
用BigDecimal实现乘法,保留了精度,上面x,y定义不变,可以改写为:
BigDecimal aBigDecimal = BigDecimal.valueOf(x).multiply(BigDecimal.valueOf(y));
System.out.println("aBigDecimal:"+aBigDecimal);
输出:
aBigDecimal:3.40282366920938477630474056040704E+38
参考文章:1.BigInteger 与 BigDecimal区别
java面试题--实现一个百亿的计算器的更多相关文章
- java面试题0004-在一个类上是否可以用abstract和final同时加以修饰?
我们先用提干两个修饰词中的任意一个创建一个类 package components.javaTest.day4_20200910; /** * Question004: * java面试题0004-在 ...
- [原]Java面试题-输入一个整型数组,找出最大值、最小值,并交换。
[Date]2013-09-19 [Author]wintys (wintys@gmail.com) http://wintys.cnblogs.com [Content]: 1.面试题 输入一个整型 ...
- java 考试试题
Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他.有些题来自网上搜集整理,有些题来自学员 ...
- JAVA笔试题(全解)
目录 一. Java基础部分................................................................. 9 1.一个".java& ...
- 【JAVA面试题系列一】面试题总汇--JAVA基础部分
JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...
- Java面试题大全(javaSe,HTML,CSS,js,Spring框架等)
目录 1. Java基础部分 7 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2.Java有没有goto? 7 3.说说&和& ...
- java 面试题 1-10
1. Java 基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法, 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 1.一个".java&q ...
- 杭电HDOJ--ACM1002(JAVA解题,运用BigInteger)(自定义MBigInteger 简单实现大数处理----完善后可以实现百亿计算器)
转载声明:原文转自http://www.cnblogs.com/xiezie/p/5501901.html JAVA解题: import java.util.*; import java. ...
- Java笔试题:给定一个ReadOnlyClass的对象roc,能否把这个对象的age值改成30?
在Java笔试面试中,经常会遇到代码题,今天我们就来看一则Java代码笔试题. 有如下代码: Class ReadOnlyClass { private Integer age=20; public ...
随机推荐
- 8天学通MongoDB——第一天 基础入门(转)
关于mongodb的好处,优点之类的这里就不说了,唯一要讲的一点就是mongodb中有三元素:数据库,集合,文档,其中“集合” 就是对应关系数据库中的“表”,“文档”对应“行”. 一: 下载 上Mon ...
- 九度oj-1001-Java
题目描述: This time, you are supposed to find A+B where A and B are two matrices, and then count the ...
- 一文学会用 Tensorflow 搭建神经网络
http://www.jianshu.com/p/e112012a4b2d 本文是学习这个视频课程系列的笔记,课程链接是 youtube 上的,讲的很好,浅显易懂,入门首选, 而且在github有代码 ...
- -webkit-margin-before
原文:https://www.cnblogs.com/guyw/p/4369653.html ----------------------------------------------- -webk ...
- js获取对象值的方式
js获取对象值的方式 var obj = {abc:"ss",nn:90}; var v1 = obj.abc;//使用点的方式 var v2 = obj["abc&qu ...
- Android 模仿QQ风格的 UI
本文内容 环境 演示模仿QQ风格的界面 本文主要演示的是 UI,如何模仿 QQ 风格的界面.虽然这个 UI 跟现在的QQ空间有点差别,但是也能学到很多东西. 下载 Demo 环境 Windows 7 ...
- maven 打包以及上传
插件 ------------------------------------------------------------------------------------------------- ...
- poj2689 Prime Distance 有难度 埃拉托斯尼斯筛法的运用
我承认这道很难(对我来说),搞脑子啊,搞了好久,数论刚开始没多久,还不是很强大,思路有点死,主要是我 天赋太差,太菜了,希望多做做有所改善 开始解析: 首先要将在 [ l,u]内的所有素数找出来,还好 ...
- python知识合集
python安装包管理 http://www.cnblogs.com/wilber2013/p/4769467.html python pip安装源管理:pypi官网的源不太好,网速慢,容易造成包下 ...
- C# chart控件基础使用
基本介绍:chart(图表) 功能:主要用来绘制折线图,柱状图与饼状图,也可达到动态效果(例如作示波器): 需要说明 一个chart可以包含多个chartArea. chartArea是具体的坐标区域 ...