大整数乘法
2018-03-20 22:27
176 查看
1.题目
有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。 输入描述: 空格分隔的两个字符串,代表输入的两个大整数 输出描述: 输入的乘积,用字符串表示 输入例子1: 72106547548473106236 982161082972751393 输出例子1: 70820244829634538040848656466105986748
2.代码
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { String str1 = sc.next(); String str2 = sc.next(); int alen = str1.length(); int blen = str2.length(); char[] s1 = str1.toCharArray(); char[] s2 = str2.toCharArray(); // 高低位对调 covertdata(s1, alen); covertdata(s2, blen); // 两数乘积位数不会超过乘数位数和+ 3位 int csize = alen + blen + 3; // 开辟乘积数组 int[] c = new int[csize]; // 乘积数组填充0 for (int ii = 0; ii < csize; ii++) { c[ii] = 0; } // 对齐逐位相乘(没有进位处理) for (int j = 0; j < blen; j++) { for (int i = 0; i < alen; i++) { c[i + j] += Integer.parseInt(String.valueOf(s1[i])) * Integer.parseInt(String.valueOf(s2[j])); } } // System.out.println(Arrays.toString(c)); int m = 0; // 进位处理 for (m = 0; m < csize; m++) { int carry = c[m] / 10; c[m] = c[m] % 10; if (carry > 0) c[m + 1] += carry; } // 找到最高位(避免前导0) for (m = csize - 1; m >= 0;) { if (c[m] > 0) break; m--; } // 由最高位开始打印乘积 for (int n = 0; n <= m; n++) { System.out.print(c[m - n]); } System.out.println(""); } } public static void covertdata(char data[], int len) { // 高低位对调 for (int i = 0; i < len / 2; i++) { data[i] += data[len - 1 - i]; data[len - 1 - i] = (char) (data[i] - data[len - 1 - i]); data[i] = (char) (data[i] - data[len - 1 - i]); } } }
转载自此博客
相关文章推荐
- 分治法实现大整数乘法
- 大整数的乘法与加法
- 大整数的加减乘法,没有除法,你想累死我啊?
- 大整数的乘法
- 【CodeVS 3123】高精度练习之超大整数乘法 &【BZOJ 2197】FFT快速傅立叶
- 用分治算法编程实现两个n位十进制大整数的乘法运算
- 1185 威佐夫游戏 V2 博弈论 + 大整数乘法
- 处女座算法之大整数乘法(从O(N^2)到O(N^1.59)的思想)
- 大整数乘法问题的解决方法
- 算法06:大整数乘法分治算法——分治法Part2
- HDU 1402 A * B Problem Plus (FFT, 大整数乘法)
- 大整数乘法
- 五大常用算法(一) 分治算法(2) 大整数乘法
- 大整数乘法
- 大整数乘法
- 贪心算法-大整数乘法/加法/减法
- 任意长度的高精度大整数和浮点数的加法和乘法
- HLG1159 MAGI System【大整数乘法】
- [codevs3123]大整数乘法(快速傅立叶变换FFT)
- wikioi3123 高精度练习之超大整数乘法