大数相乘
来源:互联网 发布:鹰潭三缺一麻将软件 编辑:程序博客网 时间:2024/06/09 21:09
需求:
有两个大数A,B,位数分别为a和b,求其乘积 ,以字符串的形式返回。
分析:
对于大数乘法,直接使用运算符*得到的结果有可能溢出,因此模拟乘法的运算步骤进行求解。
假设A=a3a2a1a0,B=b2b1b0,结果是int[] result = new int[A.length+B.length]。计算二者乘积的时候,需要逐个遍历A和B的每个数字。将字符串A和B翻转,A[i]和B[j]乘积对应着结果的[i+j],需要更新进位值和结果值。比如A[1]*B[1]对应result[2],并且在result[2]中对应的值是(carry+A[1]*B[1])%10,更新进位carry。最初实现功能的时候参数是long型,但是long型数据也是有限的,因此用字符串来代替,经过证实,可以计算大数的乘法。
代码:
/* * 计算两大数A,B乘积,以字符串形式返回 * */class BigDataMul{//计算两大数乘积public static String bigDataMul(String A, String B){//将两大数转成字符串并翻转String s1 = new StringBuilder(A).reverse().toString();String s2 = new StringBuilder(B).reverse().toString();//创建结果数组int[] result = new int[s1.length()+s2.length()];//数组的最大长度就是两字符串的长度之和int carry = 0;//初始化进位值0//遍历两个字符串,更新结果for(int j = 0; j < s2.length(); j++){int i = 0;for(; i < s1.length(); i++){carry += (s1.charAt(i) - '0')*(s2.charAt(j) - '0');result[i+j] += carry % 10;carry /= 10;}//如果进位值不是0,应该进行累加if(carry != 0){result[i+j] += carry;carry = 0;}}//更新result数组for(int i = 0; i < result.length; i++){carry += result[i];result[i] = carry % 10;carry /= 10;}//去除result数组中个多余的0StringBuilder sb = new StringBuilder();int count = result.length-1;//从后向前找不是0的角标,即乘积的有效位for(; count >= 0; count--){if(result[count] != 0){break;}}//如果count>=0,说明0-count是有效位if(count >= 0){//将结果存到缓冲区中for(int i = count; i >= 0; i--){sb.append(result[i]);}}else{//如果count<0,说明结果是0return 0+"";}return sb.toString();}public static void main(String[] args){String A = "12345678900987654321", B = "12345678900987654321";System.out.println(A+"*"+B+" = "+bigDataMul(A, B));}}
public class Solution { /* * @param num1: a non-negative integers * @param num2: a non-negative integers * @return: return product of num1 and num2 */ public String multiply(String num1, String num2) { // write your code here //将num1和num2翻转转成字符串 String s1 = new StringBuilder(num1).reverse().toString(); String s2 = new StringBuilder(num2).reverse().toString(); //创建整型数组,存储结果 int[] result = new int[num1.length()+num2.length()]; int carry = 0;//初始化进位值0 //遍历两个字符串,计算乘积 for(int i = 0; i < s1.length(); i++){ int j = 0; for(; j < s2.length(); j++){ carry += (s1.charAt(i)-'0')*(s2.charAt(j)-'0'); result[i+j] += carry % 10; carry /= 10; } //如果进位不是0,需要进位 if(carry != 0){ result[i+j] += carry; carry = 0; } } //更新result数组,进位处理 for(int i = 0; i < result.length; i++){ carry += result[i]; result[i] = carry % 10; carry /= 10; } //去除result中多余的0 int count = result.length-1; for(; count >= 0; count--){ if(result[count] != 0){ break; } } StringBuilder sb = new StringBuilder(); //当count>=0时,有效位是0到count if(count >= 0){ for(int i = count; i >= 0; i--){ sb.append(result[i]); } } else{ return 0+"";//当count<0时,说明result中全都是0,直接返回0 } return sb.toString(); }}
阅读全文
0 0
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- 大数相乘
- GP TEE中的存储
- Bandicam(高清视频录制工具)官方破解版V4.0.2.1352下载 | 含bandicam注册机
- 一个简单的CPP处理框架
- wireshark自带逆天技能
- 如何快速将PDF文件转换为图片
- 大数相乘
- shell 打印九九乘法表
- 利用Python进行数据分析(一)
- java 前台使用枚举方法(二)
- YII2.0 Activeform表单组件的使用方法
- 这是一个测试文章贴Demo
- 树状数组详解
- Android反射机制
- 常见的排序算法