西电实验:自己写大整数类
项目要求:
. 编写一个程序,要求如下:
- 设计并实现自然数(MyNaturalNumbers)及整数(MyInteger)类。
- 自然数及整数类至少能表示及处理20位自然数或整数数据。完成
- 自然数及整数类能表示及处理任意位数的自然数或整数数据。(选作。第五章内容)完成
- 自然数及整数类的设计应体现体系结构(即应设计实现完整的继承关系)。
- 自然数及整数类应提供数据赋值、数据输出、加法计算、减法计算功能。(数据输入未完成)
- 自然数及整数类应提供乘法运算、除法运算(选作)。(完成,取余也完成)
- 自然数及整数类的赋值应能正确接收带千分符号的格式及不带千分符号的格式。(什么是千分符号?)
- 自然数及整数类的赋值,对于无效数据应向用户提示信息(选作,第五章及第六章内容)。(赋值未完成)
- 自然数及整数类应通过重写equals方法实现对两个数据的大小比较。(完成)
- 自然数及整数类应通过重写toString方法实现对数据的格式化。(完成)
- 自然数类应定义toMyInteger方法,该方法实现创建一个同值的整数类实例。
- 整数类应可通过自然数对象实例创建等值的整数对象实例。
- 自然数及整数类中应定义成员变量length,表示当前数据的长度。(完成)
- 自然数及整数类中应定义静态成员变量MAX_VALUE、MIN_VALUE,表示数据的最大及最小取值。(选作)(可根据我的cmoCheck()方法得到结果)
- 构建测试类,该类实现与用户的交互,接收用户键入的数据,并完成类功能的测试。
我的项目解决方案:
package Main;
public class Main {
public static void main(String[] args) {
BigInteger b1 = new BigInteger("326");
BigInteger b2 = new BigInteger("72");
BigInteger b11 = b1.add(b2);
b11.GetRes();
BigInteger b22 = b1.sub(b2);
b22.GetRes();
BigInteger b33 = b1.mul(b2);
b33.GetRes();
BigInteger b44 = b1.divid(b2);
b44.GetRes();
BigInteger b55 = b1.mod(b2);
b55.GetRes();
}
}
class BigInteger {
private int Capacity = 16;
private int[] TemBuf = new int[Capacity];
private String value;
private int size_;
public BigInteger(int e) {
StringBuilder StrTemp = new StringBuilder();
while(0 < e) {
StrTemp.append((char)(e % 10));
e /= 10;
this.size_++;
}
this.Expend(this.size_);
int TempLen = this.size_;
for(int i = TempLen - 1;i >= 0;--i)
this.TemBuf[TempLen - 1 - i] = StrTemp.charAt(i) - '0';
this.value = TemBuf.toString();
}
public BigInteger(int[] e) {
int TempLen = e.length;
this.Expend(TempLen);
for(int i = 0;i < TempLen;++i)
this.TemBuf[i] = e[i];
this.value = TemBuf.toString();
}
public BigInteger(String e) {
if(!isNumber(e))
throw new NumberFormatException("String object has member is not Integer");
this.size_ = e.length();
this.Expend(this.size_);
int TempLen = this.size_;
for(int i = 0;i < TempLen;++i)
this.TemBuf[i] = e.charAt(i) - '0';
this.value = TemBuf.toString();
}
public BigInteger(final BigInteger e) {
int TempLen = e.GetSize();
this.Expend(TempLen);
this.size_ = TempLen;
for(int i = 0;i < TempLen;++i)
this.TemBuf[i] = e.TemBuf[i];
this.value = TemBuf.toString();
}
protected void Expend(int MaxSize) {
while(MaxSize > (this.Capacity << 1))
this.Capacity >>= 1;
this.size_ = MaxSize;
}
protected boolean isNumber(String e) {
int len = e.length();
for(int i = 0;i < len;++i) {
char ch = e.charAt(i);
if(ch < '0' || ch > '9')
return false;
}
return true;
}
public int GetSize() {
return this.size_;
}
@Override
public String toString() {
StringBuilder Temp = new StringBuilder(this.size_);
for(int i = 0;i < this.size_;++i)
Temp.append(this.TemBuf[i]);
return new String(Temp.toString().trim());
}
public void GetRes() {
this.value = this.toString();
System.out.println(this.value);
}
public BigInteger add(final BigInteger e) {
BigInteger p = new BigInteger(this);
int Len1 = p.GetSize(), Len2 = e.GetSize();
int TempLen = Len1 > Len2 ? Len1 : Len2;
int[] Temp1 = new int[TempLen + 1];
int[] Temp2 = new int[TempLen + 1];
int[] TempA = new int[TempLen + 1];
for(int i = 0;i < Len1;++i)
Temp1[i] = p.TemBuf[Len1 - i - 1];
for(int i = 0;i < Len2;++i)
Temp2[i] = e.TemBuf[Len2 - i - 1];
for(int i = 0;i < TempLen;++i)
TempA[i] = Temp1[i] + Temp2[i];
for(int i = 0;i <= TempLen;++i) {
if(TempA[i] >= 10) {
TempA[i + 1] += TempA[i] / 10;
TempA[i] %= 10;
}
}
while(0 == TempA[TempLen] && TempLen > 0)
TempLen--;
p.size_ = TempLen + 1;
p.Expend(p.size_);
for(int i = TempLen;i >= 0;--i)
p.TemBuf[TempLen - i] = TempA[i];
p.value = p.toString();
return new BigInteger(p);
}
protected BigInteger sub(final BigInteger e) {
BigInteger p = new BigInteger(this);
int Len1 = p.GetSize(), Len2 = e.GetSize();
int TempLen = Len1 > Len2 ? Len1 : Len2;
int[] Temp1 = new int[Len1 + 1];
int[] Temp2 = new int[Len2 + 1];
int[] TempA = new int[TempLen + 1];
for(int i = 0;i < Len1;++i)
Temp1[i] = p.TemBuf[Len1 - i - 1];
for(int i = 0;i < Len2;++i)
Temp2[i] = e.TemBuf[Len2 - i - 1];
for(int i = 0;i < TempLen;++i)
TempA[i] = Temp1[i] - Temp2[i];
for(int i = 0;i < TempLen;++i) {
if(0 > TempA[i]) {
TempA[i + 1]--;
TempA[i] += 10;
}
}
while(0 == TempA[TempLen - 1] && TempLen > 1)
TempLen--;
for(int i = TempLen - 1;i >= 0;--i)
p.TemBuf[TempLen - 1 - i] = TempA[i];
if(p.cmpCheck(e)) {
p.size_ = TempLen;
p.value = p.toString();
}
else {
p.size_ = TempLen + 1;// 符号位
p.value = "-".concat(p.toString());
}
return new BigInteger(p);
}
protected boolean cmpCheck(final BigInteger e) {
int Len1 = this.GetSize();
int Len2 = e.GetSize();
if(Len1 > Len2)
return true;
if(Len1 < Len2)
return false;
int i = 0;
while(i < Len1) {
if(this.TemBuf[i] < e.TemBuf[i])
return false;
i++;
}
return true;
}// this >= e => true else => false
public BigInteger mul(final BigInteger e) {
BigInteger p = new BigInteger(this);
int Len1 = p.GetSize(), Len2 = e.GetSize();
int TempLen = Len1 + Len2;
int[] Temp1 = new int[Len1 + 1];
int[] Temp2 = new int[Len2 + 1];
int[] TempA = new int[TempLen + 1];
for(int i = 0;i < Len1;++i)
Temp1[i] = p.TemBuf[Len1 - i - 1];
for(int i = 0;i < Len2;++i)
Temp2[i] = e.TemBuf[Len2 - i - 1];
for(int i = 0;i < Len1;++i)
for(int j = 0;j < Len2;++j)
TempA[i + j] += Temp1[i] * Temp2[j];
for(int i = 0;i < TempLen - 1;++i) {
if(10 <= TempA[i]) {
TempA[i + 1] += TempA[i] / 10;
TempA[i] %= 10;
}
}
while(0 == TempA[TempLen] && TempLen > 0)
TempLen--;
p.size_ = TempLen + 1;
p.Expend(p.size_);
for(int i = TempLen;i >= 0;--i)
p.TemBuf[TempLen - i] = TempA[i];
p.value = p.toString();
return new BigInteger(p);
}
public BigInteger divid(final BigInteger e) {
BigInteger p = new BigInteger(this);
if(!p.cmpCheck(e))
return new BigInteger("0");
else {
BigInteger s = new BigInteger("0");
BigInteger q = new BigInteger("1");
BigInteger Temp = new BigInteger(p);
while(Temp.cmpCheck(e)) {
s = s.add(q);
Temp = Temp.sub(e);
}
return new BigInteger(s);
}
}
public BigInteger mod(final BigInteger e) {
BigInteger p = new BigInteger(this);
if(!p.cmpCheck(e))
return new BigInteger(p);
else {
BigInteger s = new BigInteger("0");
BigInteger q = new BigInteger("1");
BigInteger Temp = new BigInteger(this);
while(Temp.cmpCheck(e)) {
s = s.add(q);
Temp = Temp.sub(e);
}
return new BigInteger(Temp);
}
}
public boolean equals(final BigInteger e) {
if(this.GetSize() != e.GetSize())
return false;
int Len = e.GetSize(), i = 0;
while(i < Len) {
if(this.TemBuf[i] != e.TemBuf[i])
return false;
i++;
}
return true;
}
}
我的简单测试结果:
后话:
由于时间有限,觉得没必要再写一个子类了,另外本人还没学到异常处理,没做一些抛出异常的工作,希望各位同仁前辈多多指教!!!欢迎hack我的程序!!!