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 }
 
 

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值