大数计算

本文介绍了一个Java程序,用于实现大数加法并验证结果。通过使用`BigInteger`类进行大数运算和自定义类`BigMath`进行大数加法,程序能够处理超过基本整型范围的数值,确保计算准确性。
  1 package cn.sice;
  2 
  3 import java.math.BigInteger;
  4 
  5 public class BigMathDemo
  6 {
  7 
  8     public static void main(String[] args)
  9     {
 10         for (int i = 0; i < 1000; i++)
 11         {
 12             // 建立测试随机数用 Math.random()方法
 13             String s1 = Long
 14                     .toString((long) (Math.random() * 1000000000 * 1000000000));
 15             String s2 = Long
 16                     .toString((long) (Math.random() * 1000000000 * 1000000000));
 17             // 建立超大数...
 18             // s1 =
 19             // "5467899342090975667578996657155768966241787596787296625767889";
 20             // s2 = "98714252890652468818789890687248909926791226256725678";
 21             // java自带大数类,用于验算结果
 22             BigInteger b = new BigInteger(s1);
 23             // java计算结果r1
 24             String r1 = b.add(new BigInteger(s2)).toString();
 25 
 26             BigMath bm = new BigMath(s1, s2);
 27             // 计算结果r2
 28             String r2 = bm.sum();
 29             if (!r1.equals(r2))
 30             {
 31                 sop(s1 + " + " + s2);
 32                 sop("BigInteger = " + r1);
 33                 sop("BigMath    = " + r2);
 34             } else
 35             {
 36                 sop(true);
 37             }
 38 
 39         }
 40 
 41     }
 42 
 43     void method()
 44     {
 45         int max1 = Integer.MAX_VALUE;
 46         int max2 = Integer.MAX_VALUE;
 47         int sum = max1 + max2;
 48         sop(sum);// -2
 49         // 证明 大数情形下 int 越界了
 50     }
 51 
 52     // 牛B方法,不解释
 53     public static void sop(Object obj)
 54     {
 55         System.out.println(obj);
 56     }
 57 
 58 }
 59 
 60 class BigMath
 61 {
 62     private int[] arr1;
 63     private int[] arr2;
 64     // 进位标志
 65     private boolean addFlag = false;
 66 
 67     public BigMath(String s1, String s2)
 68     {
 69         arr1 = changeToIntArr(s1);
 70         arr2 = changeToIntArr(s2);
 71     }
 72 
 73     // 将字符串转化为int类型数组
 74     private int[] changeToIntArr(String s)
 75     {
 76         int[] arr = new int[s.length()];
 77         for (int i = 0; i < s.length(); i++)
 78         {
 79             // 把一个字符串里的数字字符变成数字:
 80             // 1,先用charAt(index)方法变成char
 81             // 2,然后用String.valueOf(char)方法变成单字符的String
 82             // 3,再用Integer.parseInt(String)变成int类型
 83             arr[i] = Integer.parseInt(String.valueOf(s.charAt(s.length() - i
 84                     - 1)));
 85         }
 86         return arr;
 87     }
 88 
 89     public String sum()
 90     {
 91         int length1 = arr1.length;
 92         int length2 = arr2.length;
 93         int length;
 94         String[] arrResult;
 95         if (length1 >= length2)
 96         {
 97             // 数组长度+1,避免最高位进位,超出数组位数
 98             length = length1 + 1;
 99         } else
100         {
101             length = length2 + 1;
102         }
103         arrResult = new String[length];
104         for (int i = 0; i < length; i++)
105         {
106             int t1 = 0;
107             int t2 = 0;
108 
109             if (i < length1)
110             {
111                 // 取出相同位置的数
112                 t1 = arr1[i];
113             }
114             if (i < length2)
115             {
116                 // 取出相同位置的数
117                 t2 = arr2[i];
118             }
119             // 求和
120             int sum = t1 + t2;
121             // 判断是否进位
122             if (addFlag)
123             {
124                 sum += 1;
125             }
126             // 为下一次求和,设置标志位
127             if ((sum / 10) > 0)
128             {
129                 addFlag = true;
130             } else
131             {
132                 addFlag = false;
133             }
134             // 将计算结果保存在数组中
135             arrResult[i] = Integer.toString(sum % 10);
136         }
137         // 将计算结果转换成字符串
138         StringBuffer sb = new StringBuffer();
139         for (int j = arrResult.length - 1; j >= 0; j--)
140         {
141             // 数组存放的顺序是小的角标对应低位,变成字符串高位在前,取大角标
142             sb.append(arrResult[j]);
143         }
144         // 如果两数相加,两数位数一样,有没产生进位,由于避免进位多了一位,要去掉,去掉的就是数组默认初始化的0
145         if (sb.charAt(0) == '0')
146         {
147             return sb.substring(1, sb.length());
148         }
149         return sb.toString();
150     }
151 
152 }

 

转载于:https://www.cnblogs.com/linson0116/p/3541159.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值