您的位置:首页 > 其它

大数计算问题

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

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

import java.util.Scanner;

/**
* 大数相乘问题
* @author zbt
*
*/
public class MyBigData {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s1 = sc.next();
String s2 = sc.next();
int[] arr1 = new int[s1.length()];
int[] arr2 = new int[s2.length()];
int j = 0;
for (int i = s1.length() - 1; i >= 0; i--) {//逆序以数组形式存储字符串s1
arr1[j] = Integer.valueOf(String.valueOf(s1.charAt(i)));
j++;
}
j = 0;
for (int i = s2.length() - 1; i >= 0; i--) {//逆序以数组形式存储字符串s2
arr2[j] = Integer.valueOf(String.valueOf(s2.charAt(i)));
j++;
}

mutiply(arr1, arr2);
sc.close();

}

public static void mutiply(int[] arr1, int[] arr2) {//计算方法
int[] arr3 = new int[100];//创建一个容量足够大的数组来存储各个位的结果
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr2.length; j++) {
arr3[i + j] += arr1[i] * arr2[j];//关键点
}
}
// for(int arr4 : arr3){
// System.out.println(arr4);
// }
int carry = 0;//初始进位为0
for (int i = 0; i < arr3.length; i++) {
if ((arr3[i] + carry) >= 10) {
int tem = arr3[i] + carry;//本位的值加上低位的进位值,并覆盖本位
carry = tem / 10;//本位向高位的进位
arr3[i] = tem % 10;//新的本位值
} else {
arr3[i] += carry;//这里会产生无用功,具体为最高位计算完后,数组其余元素(均为0)会继续计算
carry = 0;
}
}
int index = 0;//用来寻找不等于0的最高位,以便输出值排除多余0
for (int i = arr3.length - 1; i >= 0; i--) {
if (arr3[i] != 0) {
index = i;
break;//若找到第一个不为0的最高位,终止循环
}
}
// System.out.println(index);

for (int i = index; i >= 0; i--) {//易数组形式输出大数
System.out.print(arr3[i]);
}
}

}


参考资料: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: