超出long上限的大数相加,相乘算法。
public class StringCompute {
private static final class instanceClass {
public static final StringCompute instance = new StringCompute();
}
private static StringCompute getInstance() {
return instanceClass.instance;
}
private StringCompute() {
}
/**
* [方法功能说明]
*
* @param args
*/
public static void main(String[] args) {
long start = System.currentTimeMillis();
StringCompute.getInstance().multiply("4545687745456468777878787878787", "46465464646465445456656465");
System.out.println((System.currentTimeMillis() - start)+"[ms]");
start = System.currentTimeMillis();
System.out.println(StringCompute.getInstance().add("4545687745456468777878787878787", "46465464646465445456656465"));
System.out.println((System.currentTimeMillis() - start)+"[ms]");
}
/**
*
* [超大数相加]
*
* @param a
* @param b
* @return
*/
private String add(String a, String b) {
StringBuilder c = new StringBuilder("");
char[] aArray = a.toCharArray();
char[] bArray = b.toCharArray();
int upper = 0; // 进位
int length = aArray.length < bArray.length ? aArray.length
: bArray.length;
char[] maxArray = aArray.length > bArray.length ? aArray : bArray;
int i = 0;
for (; i < length; i++) {
int temp = Integer.parseInt("" + (aArray[aArray.length - i - 1]))
+ Integer.parseInt("" + bArray[bArray.length - i - 1])
+ upper;
upper = temp / 10;
c.append(temp % 10);
}
if (aArray.length != bArray.length) {
// c.append(maxArray[maxArray.length - i -1]+upper);
for (int j = (maxArray.length - i - 1); j >= 0; j--) {
int temp = Integer.parseInt("" + (maxArray[j])) + upper;
upper = temp / 10;
c.append(temp % 10);
}
}
if (upper != 0) {
c.append(upper);
}
return c.reverse().toString();
}
private void multiply(String p1, String p2) {
// ;
int ASCII = 48;
char[] result = new char[p1.length() + p2.length()];
for (int i = 0; i < result.length; i++) {
result[i] = '0';
}
char ctemp = ' ';
//逆序
char[] pc1 = p1.toCharArray();
for (int i = 0; i < pc1.length / 2; i++) {
ctemp = pc1[i];
pc1[i] = pc1[pc1.length - 1 - i];
pc1[pc1.length - 1 - i] = ctemp;
}
//逆序
char[] pc2 = p2.toCharArray();
for (int i = 0; i < pc2.length / 2; i++) {
ctemp = pc2[i];
pc2[i] = pc2[pc2.length - 1 - i];
pc2[pc2.length - 1 - i] = ctemp;
}
int temp = 0;// 临时结果
int step = 0;// 进位
int time = 0;// 次数
int bit = 0;// 位数
for (char c1 : pc1) {
time = bit;
for (char c2 : pc2) {
temp = (c1 - ASCII) * (c2 - ASCII);
temp = temp + result[time] - ASCII;
if (temp > 9) {// 进位
int i = 0;
do {
result[time + i] = (char) (temp % 10 + ASCII);
step = (temp - temp % 10) / 10;
i++;
temp = result[time + i] - ASCII + step;
} while (temp > 9);
result[time + i] = (char) (temp + ASCII);
} else {
result[time] = (char) (temp + ASCII);
}
time++;
}
bit++;
}
System.out.println("##############################");
// System.out.print(p1 + " x " + p2 + " = ");
for (int i = result.length - 1; i >= 0; i--) {
System.out.print(result[i]);
}
System.out.println();
System.out.println("##############################");
}
}
分享到:
相关推荐
自己用C++写的一个整数相加相乘的控制台程序,用字符串来实现任意位数的整数之间的相加和相乘,通过string和int的相互转化达到我们正常计算时候的过程,不受整型规定字节数的影响,刚兴趣的朋友可以参考,有什么问题...
C++实现多项式相加相乘 在VC6.0环境下调试成功
C语言写的相加相乘的代码,有注释。简单易懂
C++实现多项式相加相减相乘操作,用链实现
数据结构实验一完成多项式的相加相乘运算.doc
稀疏矩阵相加与相乘 稀疏矩阵相加与相乘 稀疏矩阵相加与相乘
相加相乘.cpp
完成多项式的相加、相乘运算。 (1)掌握线性表的插入、删除、查找等基本操作设计与实现 (2)学习利用线性表提供的接口去求解实际问题 (3)熟悉线性表的的存储方法
用c语言实现的一元多项式的相加相乘,此为可循环版本
分别用三元组和十字链表两种方法实现了稀疏矩阵的相加和相乘
稀疏矩阵A和B均以三元组表作为存储结构,输出矩阵相加和相乘的三元组表
两个数相加c语言两个数相加c语言两个数相加c语言
分享一下用C/C++实现的大数相加和大数相乘,可以拿来当工具用。
稀疏矩阵相加、相乘和转置(用三元组实现)
数据结构实验一完成多项式的相加相乘运算.pdf
#include<iostream> using namespace std; struct LNode //定义节点类型 { float coef; int expn; LNode * next; };
能进行一元多项式的相加、相减、相乘运算。要求采用菜单驱动方式进行执行,需构造数据结构(可参考教材),算法过程。要求,输入多项式,通过菜单选择操作,打印结果。
用数组实现的一元多项式的相加/相减/相乘。
通过C++平台实现了多项式的相乘、相加的运算,复杂度较小
用链表实现多项式的加法 乘法 幂展开 。。。。。。。。。。。。。。。。。