suseoj 1207: 大整数的乘法(java, 大数相乘, C/C++, 大数相乘)
1207: 大整数的乘法
时间限制: 1 Sec 内存限制: 128 MB提交: 7 解决: 2
[提交][状态][讨论版][命题人:liyuansong]
题目描述
求两个不超过200位的非负整数的积。
输入
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
12345678900
98765432100
样例输出
1219326311126352690000
分析(Java):
使用Java的BigInteger类来解决
核心代码:
1 a = sc.nextBigInteger(); 2 b = sc.nextBigInteger(); 3 System.out.println(a.nultiplt(b));
Java代码实现(AC):
1 import java.math.BigInteger; 2 import java.util.Scanner; 3 4 5 public class Main{ 6 public static void main(String args[]) { 7 Scanner sc = new Scanner(System.in); 8 BigInteger a, b; 9 a = sc.nextBigInteger(); 10 b = sc.nextBigInteger(); 11 System.out.println(a.multiply(b)); 12 } 13 }
分析(C/C++):
Ⅰ、用C/C++进行乘法运算,就是模拟乘法运算的整个过程;
Ⅱ、要注意两点:
①、进位的处理
②、每一层运算要做到最低位的对齐原则
步骤:
①、将字符串的输入转化为对应的整型数组
②、遍历一个整型数组的每一个数与另一个整型数组所有的数相乘
③、PS,注意:进位、对齐
核心代码:
1 for(int i = 0; i < len1; ++ i) 2 { 3 int b = 0; 4 for(int j = 0; j < len2 || b; ++ j) 5 { 6 int t = i1[i]*i2[j] + ans[i+j] + b; 7 ans[i+j] = t%10; 8 b = t/10; 9 len = max(len, i+j); // len保存最终位数 10 } 11 }
C/C++代码实现(AC):
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 #include <stack> 7 #include <map> 8 #include <queue> 9 10 using namespace std; 11 12 int main() 13 { 14 char s1[205], s2[205]; 15 int len1, len2; 16 scanf("%s%s", s1, s2); 17 len1 = strlen(s1), len2 = strlen(s2); 18 19 int i1[205] = {0}, i2[205] = {0}, ans[1000] = {0}, len = 0; 20 for(int i = 0; i < len1; ++ i) 21 i1[i] = s1[len1 - 1 - i] - '0'; 22 for(int i = 0; i < len2; ++ i) 23 i2[i] = s2[len2 - 1 - i] - '0'; 24 25 for(int i = 0; i < len1; ++ i) 26 { 27 int b = 0; 28 for(int j = 0; j < len2 || b; ++ j) 29 { 30 int t = ans[i + j] + i1[i]*i2[j] + b; 31 ans[i + j] = t%10; 32 b = t/10; 33 len = max(len, j + i); 34 } 35 } 36 for(int i = len; i >= 0; -- i) 37 printf("%d", ans[i]); 38 printf("\n"); 39 return 0; 40 }