您的位置:首页 > 编程语言 > Java开发

Java 大数加减乘(无除),不含小数点

2015-12-23 09:28 483 查看
package com.algorithm;

public class BigIntegerOpeator {

public static void main(String[] args) {

String a = "1231313432";
String b = "12312376";

String result = add(a, b);
System.out.println(a + " + " + b + " = " + result);

String c = "1234";
String d = "5678";

System.out.println(c + " - " + d + " = " + sub(c, d));

String e = "1234";
String f = "1";
System.out.println(e + " * " + f + " = " + multi(e, f));
}

private static String multi(String e, String f) {
return multi(e.toCharArray(), f.toCharArray());
}

/**
* @Author:yangwl
* @date 2015年12月22日 下午4:15:36
* @param charArray
* @param charArray2
* @return
* @throws
* @Description: //大整数相乘
* 				//简单乘法+大整数加法
*/
private static String multi(char[] a, char[] b) {
int b_index = b.length;
char [] result = new char[a.length + b.length + 1];
int index = result.length;
init(result);

//首先初始化result数组
char [] t = subMulti(a, b[--b_index]);
for(int i = t.length-1; i >= 0; i--) {
result[--index] = t[i];
}
index = result.length;

int f = 1;
while(--b_index >= 0) {

char [] t1 = clearZero(result);
char [] t2 = subMulti(a, b[b_index]);
t2 = (new String(t2) + getZero(f)).toCharArray();
if(null == t1) {
t1 = result;
}
char[] t3 = add(t1, t2).toCharArray();

int l = result.length;
for(int i = t3.length-1; i >= 0; i--) {
result[--l] = t3[i];
}
f++;
}
replace(result);
return new String(result).replace("_","");
}

private static void replace(char[] result) {
for(int i = 0; i < result.length; i++) {
if(result[i] == '0') {
result[i] = '_';
} else {
break;
}
}
}

private static String getZero(int f) {
String s="";
for(int i = 0; i < f; i++) {
s += "0";
}
return s;
}

private static char[] clearZero(char[] result) {
for(int i = 0; i < result.length; i++) {
if(result[i] != '0') {
return new String(result, i, result.length - i).toCharArray();
}
}
return null;
}

private static char[] subMulti(char[] a, char c) {
char [] result = new char[a.length+1];
init(result);
int index = result.length;
int a_index = a.length;
while(--a_index >= 0 && --index >= 0) {
int r = parseToInt(a[a_index]) * parseToInt(c);
result[index] = parseToChar(parseToInt(result[index]) + r % 10);
if(r >= 10) {
result[index-1] = parseToChar(parseToInt(result[index-1]) + r / 10);
}
}
return (result[0] == '0' ?  new String(result,1,result.length-1) : new String(result)).toCharArray();
}

/*********************************************************************************************************************************************************************/

private static String sub(String a, String b) {
return sub(a.toCharArray(), b.toCharArray());
}

/**
* @Author:yangwl
* @date 2015年12月22日 下午1:10:11
* @param charArray
* @param charArray2
* @return
* @throws
* @Description: //两个数做减法
*/
private static String sub(char[] a, char[] b) {
int index = 0;
boolean flag = true;
if (a.length > b.length){
index = a.length;
}
if (b.length > a.length) {
index = b.length;
flag = false;
}
if (a.length == b.length) {
index = a.length;
for(int i = 0; i < index; i++) {
if(parseToInt(a[i]) > parseToInt(b[i])) {
break;
}
if(parseToInt(b[i]) > parseToInt(a[i])) {
flag = false;
break;
}
if(parseToInt(b[i]) == parseToInt(a[i])) {
if(i+1 == index) return parseToChar(0)+"";
continue;
}
}

}
char [] result;
if(!flag) {
result = a;
a = b;
b = result;
}
result = new char[index];
int a_index = a.length-1;
int b_index = b.length-1;
index--;
while(index != -1) {
int a_value = 10;
if(a_index > -1) {
a_value = parseToInt(a[a_index]);;
}
int sub = a_value;
if(b_index > -1) {
if(10 == sub) {
System.out.println("执行出错.");
return "";
};
int b_value =  parseToInt(b[b_index--]);
if(a_value >= b_value) {
sub = a_value - b_value;
} else {
//首先借1
a[a_index-1] = parseToChar(parseToInt(a[a_index-1]) - 1 + 48);
sub = a_value + 10 - b_value;
}
}
a_index --;
result[index--] = parseToChar(sub);
}
if(result[0] == '0') {
if(flag) {
return new String(result,1,result.length-1);
} else {
result[0] = '-';
return new String(result);
}
} else {
if(flag) {
return new String(result);
} else {
return "-"+new String(result);
}
}
}

private static String add(String a, String b) {
return add(a.toCharArray(), b.toCharArray());
}

/**
* @Author:yangwl
* @date 2015年12月21日 下午2:20:08
* @param a
* @param b
* @return
* @throws
* @Description: //TODO
*/
private static String add(char[] a, char[] b) {
int index = a.length > b.length ? a.length + 1 : b.length + 1;
char [] result = new char[index];
init(result);
int a_index = a.length;
int b_index = b.length;

int i = 0;

while(i < index) {
int temp = 0;
if(--a_index >= 0) {
temp = (int)a[a_index] - 48;
}
if(--b_index >= 0) {
temp += (int)b[b_index] - 48;
}
result[--index] =(char) ((int)(result[index]-48) + temp % 10 + 48);
if(temp / 10 == 1) {
result[index - 1] = '1';
}
}
return result[0] == '1' ? new String(result) : new String(result,1,result.length-1);
}

private static void init(char[] result) {
for(int i = 0; i < result.length; i++) {
result[i] = '0';
}
}

public static int parseToInt(char c) {
return (int)c - 48;
}

public static char parseToChar(int a) {
return (char)(a + 48);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: