问题
1.使用超大整数,请你设计一个数据结构来存储这个超大型数字以及设计一种算法来实现超大整数加法运算怎么作?
解答
:
* 如果现实中使用肯定使用BigInteger类,如果在JavaME等环境中可以考虑自己实现(但是一定考虑效率和Java中接口一致)
* 自己实现可以用数组实现一个简单的
* 如果仅仅加法就简单了。
* 如果有乘法、除法、模除(RSA加密的基础)则较麻烦,一定要参考Java源代码,如果你的是商业代码,请勿参考OpenJDK,请参考harmony .
核心代码
package mymath;
import java.util.List;
import java.util.Vector;
/**
* 整数模型版,未优化版本,和BigInteger不兼容.优化请详见java.math.BigInteger的实现
*
* @author nisen
*
*/
public class MyBigInteger {
List bytes = new Vector<Byte>();
// 内部数据表示:列表高位表示数的高位, 如4455566 表示为{4,45,55,66}
// 位数= bytes.size()*2
public MyBigInteger(String val) {
for (int i = val.length() - 1; i >= 0; i--) {
int lowValue, heightValue;
char lowChar = val.charAt(i);
try {
lowValue = Integer.parseInt("" + lowChar); // 个位
} catch (NumberFormatException e) {
throw new IllegalArgumentException("argument:" + val
+ " must be number");
}
i--; // 十位
if (i < 0) {
heightValue = 0;
} else {
char highChar = val.charAt(i);
try {
heightValue = Integer.parseInt("" + highChar); // 十位
} catch (NumberFormatException e) {
throw new IllegalArgumentException("argument:" + val
+ " must be number");
}
}
bytes.add(0, new Byte((byte) (heightValue * 10 + lowValue)));
}
}
private MyBigInteger(byte[] val) {
for (int i = 0; i < val.length; i++) {
bytes.add(new Byte(val[i]));
}
}
private MyBigInteger() {
}
public String toString() {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < bytes.size(); i++) {
buf.append(bytes.get(i));
}
return buf.toString();
}
/**
* 生成一个新的MyBigInteger
*
* @param val
* @return
*/
public MyBigInteger add(MyBigInteger val) {
MyBigInteger result = new MyBigInteger();
int maxlength = this.bytes.size() > val.bytes.size() ? this.bytes
.size() : val.bytes.size(); // 最大位数
boolean isCarry = false;// 是否进位
for (int i = 0; i < maxlength; i++) {
int valIndex = val.bytes.size() - i-1;
int thisIndex = this.bytes.size() - i-1;
Byte valByte = valIndex<0?0:(Byte) val.bytes.get(valIndex);
Byte thisByte =thisIndex<0?0:(Byte) this.bytes.get(thisIndex);
int resultByte = valByte + thisByte + (isCarry ? 1 : 0);
if (resultByte >= 100) { //是否有进位
isCarry = true;
resultByte = resultByte - 100;
} else {
isCarry = false;
}
result.bytes.add(0,(byte)resultByte);
}
return result;
}
}
测试代码
public class MyBigIntegerTest {
public static void main(String[] args) {
MyBigInteger bi=new MyBigInteger("4455566");
MyBigInteger val = new MyBigInteger("123");
MyBigInteger result = bi.add(val).add(val);
System.out.println("result="+result); //4455812
System.out.println("bi="+bi); //4455566
System.out.println("val="+val); //123
}
}
分享到:
相关推荐
利用双向循环链表实现长整数的存储,每个结点含一个整形变量。任何整形变量的范围是 -(2^15 - 1)~ (2^15 - 1)。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。 这是我用java写的,使用...
通过定义顺序栈,利用堆栈的结构来进行数的存处来实现对超长整数的计算和存储!
,基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。任何整形变量的范围是 -(2^15 - 1)~(2^15 - 1)。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
任意长的整数加法 问题描述:设计一个程序实现两个...基本要求:利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。要求输入和输出每四位一组,组间用逗号隔开。如:1,0000,0000,0000,0000。
用线性表实现整数加法,属于一个整数运算的计算器
长整数加法的总体目标:在VC6.0的开发环境下,利用...(1)设计一个实现任意长的整数加法运算演示程序。 (2)利用双向链表实现长整数的存储,每个结点含一个整型变量。 (3)输入输出形式,每四位一组,用逗号隔开。
能够实现超出int类型表示的大整数的加法运算
问题描述:设计一个程序实现两个任意长的整数的求和运算。...基本要求:利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。要求输入和输出每四位一组,组间用逗号隔开。如:1,0000,0000,0000,0000.
可实现两个200位的大整数的加法运算,代码简洁高效,不到100行。可以作为c入门学习材料。
用C++实现,数据结构课程设计报告。比较完整。
题目:编写一个Python函数,实现两个整数的加法运算,并处理可能的溢出情况。同时,要求函数能够处理任意长度的字符串作为输入,将字符串中的每个字符转换为其对应的ASCII码值,并将这些ASCII码值相加。此外,函数还...
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
这是个实现大整数运算的作业,通过链表实现大整数的加减乘法,出发会提示错误。编译器为vs2005的c++语言
C语言实现随机出10道整数加法题供用户计算
使用C语言编写的超长整数加法,可以实现100以内的超长整数的加法的运算。
当创建一个计算器应用程序时,我们需要考虑如何实现基本的数学运算功能,包括加法、减法、乘法和除法。在这篇Java实战博客中,我将向您展示如何使用Java编程语言创建一个简单的计算器应用程序。我们将从创建用户界面...
C语言实现、包含报告和代码。
可以实现任意长的整数进行加法运算的演示程序。