首先,需要指出的是,java内的BigInteger类很好用,功能相当全面。像加减乘这样的基础操作都是可以胜任的。所以,在java中其实没有手动实现高精度的必要。
所以写下这篇博客的初衷并不是放在实际情况下使用,而是当做高精度算法的练习,也同时练习java编程能力。
封装类内容:
实现接口
克隆接口Cloneable,重写clone方法。便于复制
可比较接口Comparable,实现CompareTo方法,便于比较排序。
(可搭配各种数据结构使用)
成员变量
数组number,用于记录每一位,需要指出的是,该类仅支持十进制的运算。
数组长度len,用于表示数组中数字长度,便于统计和计算
符号变量sign,用于作为符号项参与运算。取值为1或-1.
成员方法:
构造方法
提供两种构造方法,用于初始化
传入整数,按位倒序转化进数组
传入字符串,检索符号,倒序存入数组
全局方法
打印方法void print,以带符号字符串的形式打印。
高精度加法void add,传入大整数,加到对象上
高精度减法void minus,传入大整数,计算减法
高精度乘法void multiply,传入大整数,计算乘法
克隆方法BigNumber clone,深克隆对象,返回克隆对象
比较方法int compareTo,与传入大整数进行比较,大1,小-1,相等0
私有方法
整理数组void sort,传入计算后的长度,计算符号并整理数组
代码
public class BigNumber implements Cloneable,Comparable<BigNumber>
{
short[] number = new short[50000];
int len = 0;
int sign;
BigNumber(int num)
{
if(num < 0)
{
num = -num;
this.sign = -1;
}
else
{
this.sign = 1;
}
while(num != 0)
{
this.number[++len] = (short)(num % 10);
num /= 10;
}
}
BigNumber(String num)
{
this.len = num.length();
this.sign = 1;
for(int i = this.len - 1;i > 0;i--)
{
number[this.len - i] = (short)(num.charAt(i) - '0');
}
if(num.charAt(0) ==