蓝桥杯练习题P1001(大数乘法)

/*
当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.

输入:
  62773417 12345678

输出:
  774980393241726
*/

去年写过这个程序,可是只能得到83分,当时想了好久不知道为啥,不知道有木有朋友也碰到相同的情况,今天突然想到了

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char *s1 = new char[8];
    char *s2 = new char[8];
    cin >> s1 >> s2;
    char *mulNum = new char[16];
    memset(mulNum, 0, 16);
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    for (int i = len1 - 1; i >= 0; i--)
    {
        for (int j = len2 - 1; j >= 0; j--)
        {
            mulNum[i + j + 1] += (s1[i] - '0') * (s2[j] - '0');
            if (mulNum[i + j + 1] > 9)
            {
                mulNum[i + j] += mulNum[i + j + 1] / 10;
                mulNum[i + j + 1] %= 10;
            }
        }
    }
    //没想到这次想到了这个问题,以前总是得不了满分,原因就在这啊
    if(0 == mulNum[1] && 0 == mulNum[0])    //说明整体为0 
        cout<<"0"<<endl;
    else//除了乘积为0的情况, mulNum[1] 和 mulNum[0] 不可能同时为0 (注意是两个正整数相乘) 
    {
        if (mulNum[0] != 0)
            cout << int(mulNum[0]);
        for (int i = 1; i < len1 + len2; i++)
            cout << int(mulNum[i]);
    } 
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值