大数计算问题
2016-03-30 22:56
441 查看
在求阶乘问题上,我们可以使用循环或者递归的思想,如果数值范围超过基本数据类型,可以使用java中的BigDecimal和BigInteger类;但是如果不使用java中这两个类怎么来计算呢?
拿两个数相乘来说,思路在于观察我们如何手工计算相乘,用程序来模拟手工计算相乘即可
参考资料: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
拿两个数相乘来说,思路在于观察我们如何手工计算相乘,用程序来模拟手工计算相乘即可
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
相关文章推荐
- HDU 5285 wyh2000 and pupil 判二分图+贪心
- UIKit 框架之<UIScrollView>
- C常用字符串函数
- 构建权限树
- js中callback.call()和callback()的区别
- 设置启动Activity(初始显示界面)的方法
- 逆向随笔 - strcmp函数的实现和分析
- iOS 保持界面流畅的技巧
- Django 操作笔记
- c语言与C++的区别
- 前端工程师,如何更顺畅的和后端工程师合作
- [置顶] Android开发之开源框架OKHTTP的Get请求代码,得到json字符串方法
- vector,list,deque三者的区别
- OpenCV计算机编程攻略-Cv::Mat
- JSP 2特性 —— Tag File 支持
- 20135320赵瀚青LINUX第六周学习笔记
- poj 1330(初探LCA)
- 分页
- JAVA数组排序
- web在线文件管理器