1. 程式人生 > >java 大數運算[轉]

java 大數運算[轉]

運算 不能 for 相加 emp -- test return pack

用JAVA 實現算術表達式(1234324234324 + 8938459043545)/5 + 343434343432.59845
因為JAVA語言中的long 定義的變量值的最大數受到限制,例如123456789987654321這樣的整數就不能存放在long類型的變量中,如果這樣兩個大數相加或相乘,產生的結果會更大。比如,JAVA語言中如果使用long l = 1000000000這樣定義沒錯,但如果加上2000000000變成 1000000000+2000000000測試結果就為-1294967296, 成了負數。原因就是結果數太大,無法表示此結果數。那麽怎樣做才能把上述計算題給解答出來呢?
這裏我們采用陣列法,比如
long a = 123456789876
long b = 123412341234
首先我們可以定義二個數組,分組存放這些數字
long ary_a[3];
long ary_b[3];
可以把這兩個數分別分解為三個部分,每個部分都是四位,也就是:
ary_a [0] = 1234;
ary_a [1] = 5678;
ary_a [2] = 9876;
ary_b [0] = 1234;
ary_b [1] = 1234;
ary_b [2] = 1234;
接下來的事情就是進位了
來一個小點的數,比如 38 + 25 分解一下
個位相加 8+5=13 需進位 , 結果的個位為3
十位相加 1+3+2 = 6
可以得到一個規律
進位數 = 13 / 10
個位所留下來的位 = 13 % 10
程序中如下實現
public class Test1 {
public static void main(String[] args) {
int a = 38;
int b = 25;

int[] ary_a = {3, 8};
int[] ary_b = {2, 5};

int r_1 = ary_a[0] + ary_b[0];
int r_2 = ary_a[1] + ary_b[1];

/* r_1 = 5, r_2 = 13 */
System.out.println(r_1);
System.out.println(r_2);

/* 結果的進位 */
int carry = r_2 / 10;
System.out.println(carry);

/* 結果的個位 */
int g = r_2 % 10;
System.out.println(g);

/* 十位 */
int s = carry+r_1;
System.out.println(s);

/*結果為63*/
System.out.println(s+""+g);

}
}

如果是三位數,以此類推
下面給出簡單示例
package com;
public class BigNumberOperation {

/*加法*/
public int[] add(int[] f, int[] s, int n) {

/*定義余數,初始為0*/
int carry = 0;

/*定義返回的數組*/
int[] c = new int[f.length];
/*遍歷傳入的兩個數組,分別計算*/
for(int i = f.length - 1; i >= 0; i--) {
c[i] = f[i] + s[i] + carry;
if(c[i] < n) {
carry = 0;
}
else {
c[i] = c[i] - n;
carry = 1;
}
}
return c;
}


/*乘法,b為以內的數*/
public int[] mul(int[] a, int b) {
int carry = 0;

int[] c = new int[a.length];

if(b>10) {
return c;
}

for(int i = a.length - 1; i >=0; i--) {
int tmp = a[i] * b + carry;
c[i] = tmp % 10;
carry = tmp / 10;
}
return c;
}

/* 字符串轉為整型數組 */
public int[] getInts(String s) {
int[] temp = null;
if(s!=null && s.length()>0){
temp = new int[s.length()];
for (int i = 0; i < s.length(); i++) {
temp[i] = Integer.parseInt(s.substring(i,i+1));
}
}
return temp;

}

/* 測試 */

public static void main(String[] args) {
BigNumberOperation bno = new BigNumberOperation();

/* 兩個整數數組 */

int[] f = {1234,3242,3432,4};

int[] s = {8938,4590,4354,5};

/* 調用兩數相加的方法 */
int[] t = bno.add(f, s, 100000);

StringBuffer sb = new StringBuffer();

/* 結果添加到StringBuffer */
for (int j = 0; j < t.length; j++) {
sb.append(t[j]);
}
System.out.println(sb.toString());
int[] bb = bno.getInts(sb.toString());

/* 乘法 */
bb = bno.mul(bb, 5);

/* 輸出結果 */
for (int i = 0; i < bb.length; i++) {
System.out.print(bb[i]);
}
System.out.println();
}
}
}

後面加的那個小數就很簡單了
343434343432.59845
在JAVA中也可以使用
java.math.BigDecimal
java.math.BigInteger
來進行大數運算

java 大數運算[轉]