大整数相乘
来源:互联网 发布:linux下php言编程ide 编辑:程序博客网 时间:2024/06/06 02:53
import java.math.BigInteger;public class Solution { //解法1 public String multiply(String num1, String num2) { if (num1 == null || num1.length() == 0 || (num1.length() == 1 && num1.trim().equals("0")) || num2 == null || num2.length() == 0 || (num2.length() == 1 && num2.trim().equals("0"))) return "0"; int starti = num1.charAt(0) == '-' ? 1 : 0; int startj = num2.charAt(0) == '-' ? 1 : 0; boolean negative = false; if ((starti == 1 && startj == 0) || (starti == 0 && startj == 1)) { negative = true; } if (num1.charAt(0) == '-') num1 = num1.substring(1); if (num2.charAt(0) == '-') num2 = num2.substring(1); int total = 0; int[] result = new int[num1.length() + num2.length()]; for (int i = num1.length() - 1; i >= 0; i--) { int carry = 0; for (int j = num2.length() - 1; j >= 0; j--) { total = result[i + j + 1] + (num1.charAt(i) - '0') * (num2.charAt(j) - '0') + carry; result[i + j + 1] = total % 10; carry = total / 10; } result[i] += carry; } int start = result[0] == 0 ? 1 : 0; StringBuilder sb = new StringBuilder(); while (start < result.length) { sb.append(result[start++]); } if (negative) { return "-" + sb.toString(); } else { return sb.toString(); } } //解法2 public String multiply2(String num1, String num2) { if (num1 == null || num1.length() == 0 || (num1.length() == 1 && num1.trim().equals("0")) || num2 == null || num2.length() == 0 || (num2.length() == 1 && num2.trim().equals("0"))) return "0"; int r = 0; int[] result = new int[1000]; char[] nums1 = num1.toCharArray(); char[] nums2 = num2.toCharArray(); int starti = nums1[0] == '-' ? 1 : 0; int startj = nums2[0] == '-' ? 1 : 0; int startIndex = 0; for (int i = num1.length() - 1; i >= starti; i--) { int sum = 0; int mulSum = 0; int k = 0; int[] temp = new int[1000]; for (int j = num2.length() - 1; j >= startj; j--) { mulSum = sum + (nums1[i] - '0') * (nums2[j] - '0'); temp[k++] = mulSum % 10; sum = mulSum / 10; } if (sum > 0) { temp[k++] = sum; } r = add(result, r, temp, k, startIndex++); } StringBuilder sb = new StringBuilder(); for (int p = r - 1; p >= 0; p--) { sb.append(result[p]); } if ((nums1[0] == '-' && nums2[0] != '-') || (nums2[0] == '-' && nums1[0] != '-')) { return "-" + sb.toString(); } else { return sb.toString(); } } public int add(int[] result, int r, int[] nums, int k, int startIndex) { int i = startIndex; int j = 0; int index = startIndex; int sum = 0; int d1, d2; while (i < r || j < k || sum > 0) { d1 = i < r ? result[i] : 0; d2 = j < k ? nums[j] : 0; sum += d1 + d2; result[index++] = sum % 10; sum /= 10; i++; j++; } return index; } public static void main(String[] args) { String a = "-123"; String b = "456"; System.out.println(new Solution().multiply(a, b)); System.out.println(new BigInteger(a).multiply(new BigInteger(b))); }}
[参考]
https://discuss.leetcode.com/topic/9449/brief-c-solution-using-only-strings-and-without-reversal
0 0
- 大整数相乘问题
- 大整数相乘算法
- 大整数相乘算法!
- 大整数相乘
- 大整数相乘算法
- 大整数相乘
- 大整数相乘
- 大整数相乘
- 大整数相乘
- 大整数相乘
- 大整数相乘算法
- 大整数相乘
- 大整数相乘
- 大整数相乘
- 大整数相乘
- 大整数相乘
- 两个大整数相乘
- 大整数相乘
- 【华为 OJ】 明明的随机数
- 让猪起飞的风口——《虚拟现实:你不可不知的下一代计算平台》
- CSU 1588 合并果子
- spark集群启动命令和Web端口查看
- 简单算法学习笔记二
- 大整数相乘
- hdu 5792 World is Exploding 树状数组
- RabbitMQ(二)RabbitMQ基础概念详细介绍
- Ubuntu安装搜狗拼音相关问题
- VC隐藏任务栏,让窗口全屏
- 师兄帮帮我
- Cow Marathon
- iOS pop到指定的页面
- 【POJ】[1985]Cow Marathon