LeetCode_43---Multiply Strings
2015-06-19 13:44
411 查看
Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
Hide Tags
Math String
翻译:实现大数乘法,可以参照Integer的乘法方法
Code:
/**
*
*/
package From41;
import java.math.BigInteger;
import java.util.Arrays;
/**
* @author MohnSnow
* @time 2015年6月19日 上午11:19:39
*
*/
public class LeetCode43 {
/**
* @param argsmengdx
* -fnst
*/
//每次总是纠结于一个位置上只能放一个个位数,其实可以放一个int
//可以参考BigInteger的multiplyToLen方法
//328msA
public static String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
int n1Len = num1.length();
int n2Len = num2.length();
int[] result = new int[n1Len + n2Len];
for (int i = n1Len - 1; i >= 0; i--) {
for (int j = n2Len - 1; j >= 0; j--) {
//System.out.println("大数相乘 : " + Arrays.toString(result));
result[i + j + 1] += (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
}
}
System.out.println("大数temp1 : " + Arrays.toString(result));
int temp = 0;//缓存进位
for (int m = result.length - 1; m >= 0; m--) {
temp = result[m] / 10;
if (temp != 0) {
result[m - 1] += temp;
result[m] = result[m] % 10;
}
}
System.out.println("大数temp2 : " + Arrays.toString(result));
StringBuffer resultStr = new StringBuffer();
for (int a = 0; a < result.length; a++) {
if (result[a] != 0) {
for (int b = a; b < result.length; b++) {
resultStr.append(result[b]);
}
return resultStr.toString();
}
}
return resultStr.toString();
}
public static void main(String[] args) {
String num1 = "52";
String num2 = "60";
BigInteger a = BigInteger.TEN;
System.out.println("大数相乘 : " + multiply(num1, num2));
}
}
Note: The numbers can be arbitrarily large and are non-negative.
Hide Tags
Math String
翻译:实现大数乘法,可以参照Integer的乘法方法
private int[] multiplyToLen(int[] x, int xlen, int[] y, int ylen, int[] z) { int xstart = xlen - 1; int ystart = ylen - 1; if (z == null || z.length < (xlen+ ylen)) z = new int[xlen+ylen]; long carry = 0; for (int j=ystart, k=ystart+1+xstart; j>=0; j--, k--) { long product = (y[j] & LONG_MASK) * (x[xstart] & LONG_MASK) + carry; z[k] = (int)product; carry = product >>> 32; } z[xstart] = (int)carry; for (int i = xstart-1; i >= 0; i--) { carry = 0; for (int j=ystart, k=ystart+1+i; j>=0; j--, k--) { long product = (y[j] & LONG_MASK) * (x[i] & LONG_MASK) + (z[k] & LONG_MASK) + carry; z[k] = (int)product; carry = product >>> 32; } z[i] = (int)carry; } return z; }
Code:
/**
*
*/
package From41;
import java.math.BigInteger;
import java.util.Arrays;
/**
* @author MohnSnow
* @time 2015年6月19日 上午11:19:39
*
*/
public class LeetCode43 {
/**
* @param argsmengdx
* -fnst
*/
//每次总是纠结于一个位置上只能放一个个位数,其实可以放一个int
//可以参考BigInteger的multiplyToLen方法
//328msA
public static String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
int n1Len = num1.length();
int n2Len = num2.length();
int[] result = new int[n1Len + n2Len];
for (int i = n1Len - 1; i >= 0; i--) {
for (int j = n2Len - 1; j >= 0; j--) {
//System.out.println("大数相乘 : " + Arrays.toString(result));
result[i + j + 1] += (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
}
}
System.out.println("大数temp1 : " + Arrays.toString(result));
int temp = 0;//缓存进位
for (int m = result.length - 1; m >= 0; m--) {
temp = result[m] / 10;
if (temp != 0) {
result[m - 1] += temp;
result[m] = result[m] % 10;
}
}
System.out.println("大数temp2 : " + Arrays.toString(result));
StringBuffer resultStr = new StringBuffer();
for (int a = 0; a < result.length; a++) {
if (result[a] != 0) {
for (int b = a; b < result.length; b++) {
resultStr.append(result[b]);
}
return resultStr.toString();
}
}
return resultStr.toString();
}
public static void main(String[] args) {
String num1 = "52";
String num2 = "60";
BigInteger a = BigInteger.TEN;
System.out.println("大数相乘 : " + multiply(num1, num2));
}
}
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#数据结构与算法揭秘二
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#常见算法面试题小结
- JavaScript 组件之旅(二)编码实现和算法
- PHP排序算法类实例