程式碼實現超過long長度的數字乘法運算[Java程式碼]
阿新 • • 發佈:2018-12-18
寫完之後百度了一下我哭了,因為這種方法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);
}
}