JAVA大数运算

有一道这样的笔试题,对于初学者可能有些难度:

用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,string,class,语言,c,测试)