大数相乘问题(java版)
2017-08-03 20:31
351 查看
将两个大数保存到字符串中,他们相乘的结果也保存到字符串中,那么无论多大的数,都能够用这种方法去解决。
首先看下我们数学上怎么去计算两个数字相乘的:
![](https://img-blog.csdn.net/20170803202655436?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM4MjQzMTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
如果我们用程序把上面的过程写出来,那么这个问题就解决了。
java代码如下:
首先看下我们数学上怎么去计算两个数字相乘的:
如果我们用程序把上面的过程写出来,那么这个问题就解决了。
java代码如下:
package com.zyk.model; import java.util.Scanner; public class BigNumMuti { public static void main(String[] args) { Scanner can = new Scanner(System.in); try{ String line1 = can.nextLine().trim(); String line2 = can.nextLine().trim(); String result = multiBigInteger(line1,line2); System.out.println(result); }finally{ can.close(); } } public static String multiBigInteger(String num1, String num2) { //字符串的长度 int num1Len = num1.length(); //num1的长度 int num2Len = num2.length(); //num2的长度 int i, j, k; //循环计数器 int res; //每次一位相乘/相加的结果 int carry = 0; //进位 int offset = 0; //加法的偏移位 //每次相乘的结果 int tempResLen = num1Len; //每次相乘结果的最大长度 ,每次num1乘以num2每一位的结果最大长度是num1Len+1,由于下标从0开始,所以减一后约去1,只剩num1Len char[] tempRes = new char[tempResLen+2]; //用来保存每次相乘的结果 //最终结果 //结果的最大长度 int resultLen = num1Len + num2Len - 1; //结果长度最大为num1长度和num2长度之和,由于下标从0开始,所以要减一 char[] result = new char[resultLen+1]; for(j = num2Len - 1; j >= 0; j--) { for(i = num1Len-1; i >= 0; i--) { res = Integer.parseInt(num1.charAt(i) + "") * Integer.parseInt(num2.charAt(j) + "") + carry; tempRes[tempResLen--] = toChar(res % 10);// 把结果的个位放在结果集里面 carry = res / 10;//得到结果集进入的数 } //乘数的最后一位数与被乘数的一个数字想成的进位没有算 //tempRes第一位为进位,刚刚的循环是没有算的,最后把进位算上 tempRes[tempResLen] = toChar(carry); tempResLen = num1Len; carry = 0; //乘数与被乘数的一位数乘完后,与之前的数字相加 //由result的末尾开始计算和,算完一次,向左偏移一位 for(k = resultLen-offset; k > (resultLen-offset-num1Len); k--) { res = toInt(result[k]) + toInt(tempRes[tempResLen--]) + carry; result[k] = toChar(res%10); carry = res/10; } //最后一个相加数的进入 result[k] = toChar(toInt(result[k]) + toInt(tempRes[tempResLen]) + carry); carry = 0; tempResLen = num1Len; offset++; } String str = new String (result); while (str.startsWith("0")) { str = str.substring(1); } return str; } public static char toChar(int c){ return String.valueOf(c).charAt(0); } public static int toInt(char c){ try { return Integer.valueOf(c + ""); } catch (Exception e) { return 0; } } }
相关文章推荐
- 大数相乘问题--算法思想及Java实现解析(附详细注释)
- 关于大数相乘问题(Java实现)
- 大数相乘的问题
- java如何用数组解决大数阶乘的问题,例如求n!,n=100000
- 算法题-大数相乘问题
- Java处理两个大数相乘
- 大数问题:用字符串解决大数相加和相乘
- 大数相乘问题
- 深入分析C++中两个大数相乘结果不正确的问题
- 两个大数相乘JAVA版
- 浅谈一下大数相乘有关思路(图解)与用java代码具体解决方案
- 算法理解——大数相乘问题
- 大数算法 -- 正整数相乘(Java 实现)
- 大数相乘问题---转载
- 大数问题:用字符串解决大数相加和相乘。【转】
- java版大数相乘
- 一道C语言面试题——大数相乘的问题
- 大数问题:用字符串解决大数相加和相乘(转载)
- UVA 10106 - Product (大数相乘问题)
- 大数相乘 (JAVA版)