大数计算问题

在求阶乘问题上,我们可以使用循环或者递归的思想,如果数值范围超过基本数据类型,可以使用java中的BigDecimal和BigInteger类;但是如果不使用java中这两个类怎么来计算呢?

拿两个数相乘来说,思路在于观察我们如何手工计算相乘,用程序来模拟手工计算相乘即可

 1 import java.util.Scanner;
 2 
 3 /**
 4  * 大数相乘问题
 5  * @author zbt
 6  *
 7  */
 8 public class MyBigData {
 9 
10     public static void main(String[] args) {
11         Scanner sc = new Scanner(System.in);
12         String s1 = sc.next();
13         String s2 = sc.next();
14         int[] arr1 = new int[s1.length()];
15         int[] arr2 = new int[s2.length()];
16         int j = 0;
17         for (int i = s1.length() - 1; i >= 0; i--) {//逆序以数组形式存储字符串s1
18             arr1[j] = Integer.valueOf(String.valueOf(s1.charAt(i)));
19             j++;
20         }
21         j = 0;
22         for (int i = s2.length() - 1; i >= 0; i--) {//逆序以数组形式存储字符串s2
23             arr2[j] = Integer.valueOf(String.valueOf(s2.charAt(i)));
24             j++;
25         }
26         
27         mutiply(arr1, arr2);
28         sc.close();
29 
30     }
31 
32     public static void mutiply(int[] arr1, int[] arr2) {//计算方法
33         int[] arr3 = new int[100];//创建一个容量足够大的数组来存储各个位的结果
34         for (int i = 0; i < arr1.length; i++) {
35             for (int j = 0; j < arr2.length; j++) {
36                 arr3[i + j] += arr1[i] * arr2[j];//关键点
37             }
38         }
39 // for(int arr4 : arr3){
40 // System.out.println(arr4);
41 // }
42         int carry = 0;//初始进位为0
43         for (int i = 0; i < arr3.length; i++) {
44             if ((arr3[i] + carry) >= 10) {
45                 int tem = arr3[i] + carry;//本位的值加上低位的进位值,并覆盖本位
46                 carry = tem / 10;//本位向高位的进位
47                 arr3[i] = tem % 10;//新的本位值
48             } else {
49                 arr3[i] += carry;//这里会产生无用功,具体为最高位计算完后,数组其余元素(均为0)会继续计算
50                 carry = 0;
51             }
52         }
53         int index = 0;//用来寻找不等于0的最高位,以便输出值排除多余0
54         for (int i = arr3.length - 1; i >= 0; i--) {
55             if (arr3[i] != 0) {
56                 index = i;
57                 break;//若找到第一个不为0的最高位,终止循环
58             }
59         }
60 // System.out.println(index);
61 
62         for (int i = index; i >= 0; i--) {//易数组形式输出大数
63             System.out.print(arr3[i]);
64         }
65     }
66 
67 }

 

参考资料:http://blog.csdn.net/lichong_87/article/details/6860329

              http://blog.csdn.net/oh_maxy/article/details/10903929?utm_source=tuicool&utm_medium=referral

              http://www.cnblogs.com/lr-ting/p/3998478.html

 

posted @ 2016-03-30 22:56  crazybuddy  阅读(273)  评论(0编辑  收藏  举报