写完之后百度了一下我哭了,因为这种方法Java官方Api就可以实现,而且使用很方便很强大……
Q:为什么要写这个?
A:昨天晚上失眠,睡不着忽然想到这个问题,然后思考了一下写法,今天下午摸鱼写了出来。
注:使用Java的BigInteger类可以实现大数字的处理运算,具体可以参考这篇博客博客地址
我的思路是这样的,一个乘法运算可以分解为多次的加法运算来进行处理,比如:
- 5 * 3 = 5 + 5 + 5 = 10 + 5 = 15
所以我在代码中先使用一个循环,循环的因子是乘法运算中的两个数字中的较小的一个(因为这样可以提升一些效率),然后使这个因子每次都减一,没减一一次,就把另外一个较大的数字自身与sum相加。
伪代码:
乘数0 与乘数1,乘数0 < 乘数1
sum = 0;
while 乘数0 != 0
乘数0--;
sum += 乘数1;
当然由于计算的都是超过long大小的数字,所以这些乘数和sum在代码中都是通过String来修饰的。
代码如下:
public class GetLongNumSum {
private String numString1;
private String numString2;
private boolean isNegative = false;
public GetLongNumSum(String numString1, String numString2) {
// TODO Auto-generated constructor stub
//判断数据长度>0
if (numString1 == null || numString2 == null ||
numString1.length() < 1 || numString2.length() < 1) {
System.out.println("传入的参数有错误");
return;
}
//判断结果是否是负数,修改字符串内容(去掉负号)
if (numString1.startsWith("-")) {
isNegative = !isNegative;
numString1 = numString1.substring(1, numString1.length());
}
if (numString2.startsWith("-")) {
isNegative = !isNegative;
numString2 = numString2.substring(1, numString2.length());
}
//判断数据是否全为数字,
if (!isAllNumber(numString1) || !isAllNumber(numString2)) {
System.out.println("传入的参数有错误");
return;
}
//将字符串前面的0去掉
numString1 = deleteBufZero(numString1);
numString2 = deleteBufZero(numString2);
//数据正常,开始进行运算
this.numString1 = numString1;
this.numString2 = numString2;
showMulResult();
}
//运算的Main方法
private void showMulResult() {
String numString1Temp;//保存比较大的那个乘数
String numString2Temp;//保存比较小的那个乘数
if (numString1.length() > numString2.length()) {
numString1Temp = numString1;
numString2Temp = numString2;
} else {
numString1Temp = numString2;
numString2Temp = numString1;
}
String sum = numString1Temp;
//这儿的核心是把乘法进行分解,分解成多次的加法进行运算,比如5*3 = 5 + 5 + 5 = 10 + 5 = 15
System.out.println("开始时间: " + System.currentTimeMillis());
if (numString2Temp.length() == 1 && numString2Temp.charAt(0) == '0') {//一个乘数为0直接结果为0
sum = "0";
} else if (numString2Temp.length() == 1 && numString2Temp.charAt(0) == '1') {//一个乘数为1直接结果为1
sum = numString1Temp;
} else {
numString2Temp = deleteNumber(numString2Temp);//先进行一次乘数--,避免最终结果多加了一遍的问题
while(!isAllNumber0(numString2Temp)) {//是否为0
numString2Temp = deleteNumber(numString2Temp);//--运算
sum = numberSum(sum, numString1Temp);//求和运算
}
}
System.out.println("计算结果: " + sum);
System.out.println("结束时间: " + System.currentTimeMillis());
}
//加法运算
private String numberSum(String buf1, String buf2) {
int buf1Length = buf1.length();
int buf2Length = buf2.length();
int tMinLength = Math.min(buf1Length, buf2Length);
String Sum = "";
boolean isCarry = false;//上一次的运算是否存在进位
for (int i = 0; i < tMinLength; i++) {
char c1 = buf1.charAt(buf1Length - i - 1);
char c2 = buf2.charAt(buf2Length - i - 1);
int num1 = c1 - '0';
int num2 = c2 - '0';
int isCarryTemp = 0;
if (isCarry) {//如果上次存在进位
isCarryTemp = 1;
Sum = Sum.substring(1, Sum.length());
}
int num3 = (num1 + num2 + isCarryTemp)%10;//个位
if (num1 + num2 + isCarryTemp >= 10) {
Sum = "1" + num3 + Sum;
isCarry = true;
} else {
Sum = num3 + Sum;
isCarry = false;
}
}
if (buf1Length < buf2Length) {
buf2 = buf2.substring(0, buf2Length-buf1Length);
} else {
buf2 = buf1.substring(0, buf1Length-buf2Length);
}
if (isCarry) {
int buf2LengthTemp = buf2.length();
int i;
for (i = 0; i < buf2LengthTemp; i++) {
char c = buf2.charAt(buf2LengthTemp - i - 1);
int tempNum = c - '0' + 1;
if (tempNum > 9) {
buf2 = buf2.substring(0, buf2LengthTemp - i - 1) + tempNum%10 +
buf2.substring(buf2LengthTemp - i, buf2LengthTemp);
} else {
buf2 = buf2.substring(0, buf2LengthTemp - i - 1) + tempNum%10 +
buf2.substring(buf2LengthTemp - i, buf2LengthTemp);
break;
}
}
if (i == buf2LengthTemp) {
buf2 = "1" + buf2;
}
Sum = Sum.substring(1, Sum.length());
}
Sum = buf2 + Sum;
return Sum;
}
//将字符串数字减1
private String deleteNumber(String buf) {
boolean lendNumFlag = false;
String bufTemp = buf;
int i;
for (i = buf.length()-1; i >= 0; i--) {
int num = buf.charAt(i) - '0' - 1;
buf = buf.substring(0, i) + ((num+10)%10) + buf.substring(i+1, buf.length());
if (num >= 0) {
break;
}
}
return buf;
}
//去掉字符串前面的0
private String deleteBufZero(String buf) {
for (int i = 0; i < buf.length(); ) {
if (buf.length() < 2) {
break;
}
if (buf.charAt(i) == '0') {
buf = buf.substring(1, buf.length());
} else {
break;
}
}
return buf;
}
//判断字符串是否全为0
private boolean isAllNumber0(String buf) {
for (int i = 0; i < buf.length(); i++) {
if (buf.charAt(i) != '0') {
return false;
}
}
return true;
}
//判断字符串是否全为数字
private boolean isAllNumber(String buf) {
String reg = "^\\d+$";
return buf.matches(reg);
}
}