A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 最初的理想 黑马帝   /  2012-2-7 20:15  /  7665 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 最初的理想 于 2012-2-9 09:54 编辑

计算机中用固定数量的几个字节来存储的数值,所以计算机中能够表示的数值是有一定的范围的.比如-128在内存中对应的二进制数据为10000000,如果两个-128相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,00000000,由于进位后超过了byte类型的存储空间,所以进位部分被舍弃,即最终的结果为00000000,也就是0,这样的结果显然不是我们期望的。就是说java中的算术运算是会发生越界的,那么我们要进行大范围数据运算的话,只能自己设计出一个类来进行了,这个类有很大的字节数组能表示很大范围的数。那么如何设计一个类来表示很大范围的数呢,比如上千亿万亿等等。有一个面试题就是设计一个100亿的计算器。高手们能否设计下?

4 个回复

倒序浏览
不怎么会,好像是可以通过数组来完成。
回复 使用道具 举报
现在寄存器一般都是32位的,不是能表示出百亿千亿吗
回复 使用道具 举报
Long.MAX_VALUE=922,3372,0368,5477,5807
这个值比100,0000,0000要大很多

我想你需要的大概是哪种算个100位的数的加减运算吧
没具体写代码 写点思路吧
需求为计算a+b a-b a*b
先说加
1.可以将a和b用字符串读入
2.将其转化为int[] a1和b1
2.5 判断大小 将他们反向 并转为int[max.length+1] a2,b2
3.从个位开始遍历 使用加法原则即
for (i=0,x=0;i<maxa2.length;i++)//x为进位
{
sum[i]=(a2[i]+b1[i])%10+x;
x=(a2[i]+b1[i])/10;
}
4.逆向打印sum数组
关于减法也是类似的思路,

而对于乘法则特殊一些 pro.length=a1.length+b1.length+1
需要进行一次双重循环
for(i=0,x=0;i<pro.length;i++)
{
for(j=0,pro=x;j<b1.length;j++)
{
pro=pro+a1[j]*b1[i-j];
}
pro[i]=pro%10;
x=pro/10;
}
//x为进位

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
可以用下面一个使用整数做实验的例子程序体验一下:
                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(BigInteger other)
                {
                       
                }
                public BigInteger multiply(BigInteger other)
                {
                       
                }
                public BigInteger divide(BigInteger other)
                {
                       
                }

}
备注:要想写出这个类的完整代码,是非常复杂的,如果有兴趣的话,可以参看jdk中自带的java.math.BigInteger类的源码。

················································································································································································
张老师的面试大全里面有思路。不过也没有设计出来最终的程序。初学!共勉!

评分

参与人数 1技术分 +1 收起 理由
admin + 1 有总比没有好!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马