大数计算问题
在求阶乘问题上,我们可以使用循环或者递归的思想,如果数值范围超过基本数据类型,可以使用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