【算法】字符串大整数相乘

该博客介绍了如何处理两个大整数相乘的问题,通过模拟列竖式计算,将字符串形式的数字转换为相乘结果。关键在于实现字符串相加和字符串与字符相乘的算法。

题目描述:
给定两个以字符串形式存储的大整数,要求以字符串形式输出相乘后的结果。
思路:
模拟计算乘法时列竖式的过程,对于两个字符串s1和s2,让s2的每一位和s1整体相乘,求得一组中间值,然后对中间值做移位操作,最后将移位后的所有中间值相加即可求得最终结果。
问题的关键在于实现两个函数,用于计算两个字符串相加以及字符串和单个字符相乘的结果。

//计算两个字符串相加
string myadd(const string &s1, const string &s2);
//字符串和单个字符相乘
string mymult(const string &s, const char c);
//消除结果中多余的‘0’
string & check_num(string &s);

//计算俩个字符串的乘积
string mymult(string &s1, string &s2)
{
    string res;
    string tmp;
    int n = s2.size();

    for(int i = n-1; i >= 0; i--){
        tmp = mymult(s1, s2[i]);

        //向左移位
        for(int j = 0; j < n-1-i; j++)
            tmp.push_back('0');
        res = myadd(res, tmp);
    }

    return check_num(res);
}

string mymult(const string &s, const char c)
{
    string res;
    int carry = 0;
    int mult = 0;

    for(int i = s.size()-1; i >= 0; i--){
        mult = (s[i] - '0') * (c - '0') + carry;
        carry = mult/10;
        res.insert(res.begin(), char('0' + mult%10));
    }

    if(carry > 0)
        res.insert(res.begin(), char('0' + carry));

    return res;
}

string myadd(const string &s1, const string &s2)
{
    string res;
    int c = 0;
    int sum = 0;
    int i = s1.size() - 1;
    int j = s2.size() - 1;
    int n = min(i,j) + 1;

    while(i >= 0 && j >= 0){
        sum = (s1[i]-'0') + (s2[j]-'0') + c;
        c = sum/10;
        res.insert(res.begin(), char('0' + sum%10));
        i--;
        j--;
    }

    if(i < 0 && j < 0){
        if(c > 0)
            res.insert(res.begin(), char('0'+c));
        return res;
    }

    while(i >= 0){
        int sum = (s1[i]-'0') + c;
        c = sum/10;
        res.insert(res.begin(), char('0' + sum%10));
        i--;
    }

    while(j >= 0){
        int sum = (s2[j]-'0') + c;
        c = sum/10;
        res.insert(res.begin(), char('0' + sum%10));
        j--;
    }

    return res;
}

string & check_num(string &s)
{
    if(s.size() == 0){
        s.push_back('0');
        return s;
    }

    while(s[0] == '0' && s.size() > 1){
        s.erase(0, 1);
    }
    return s;
}
概述:文件里面是东南大学信息科学与工程学院(原无线电系)的攻读硕士研究生入学考试或者说考研复习资料。内容是清华大学电子系的考研资料。可以帮助复习。(关键字啰嗦点是为了更多的人能搜到)--------------------------------------------------附件内容:1. 《信号与系统复习考研例题详解》张朋友电子工业出版社2. 信号与系统--陆建华-20043. 郑君里《信号与系统》(第二版) 答案4. DSP作业题目及分析5. 清华大学00到08信号与系统试题--------------------------------------------------资料由来:1. 我本身并不考研,这是我们本专业的同学考研搜集的资料。因为很多朋友或者朋友的朋友都要考我们专业。我感觉到这份资料的需求量还是挺大的,因此传到这里来。希望对相关的考研同学有所帮助。2. 这个只是部分资料。由于上传空间限制和为了分类清晰,还有以下资料大家可以在我的资源里找到:*************************************************1). 专业课课件(几个版本都传上来,给大家参考);2). 2000-2008年东南大学信息科学与工程学院(原无线电系)考研专业课真题和部分答案。3). 老版本的无线电系专业课初始试卷,里面的资料更老,还有九十年代的试卷,需要的可以下载。4). 考研复试专业课的课件也上传了。我分了方向,分别为微波电路方向课件和通信信号信息安全方向课件。需要的同学可以分别下载。5). 清华大学电子系考研资料,信号系统的,可以学习。*************************************************--------------------------------------------------其他:* 资源分10分,如果评论资源的话,会返还11分,欢迎评论。我这样设置的原因是:希望您下载资源之后,能够评论一下,也好让我知道上传资源的情况。如果资源分不够,可以再申请一个号。请个别同学不要再回帖抱怨资源分高了,因为,我整理上传这么多资料确实花了不少时间。绝对比你下载的时间长。哈哈。花点时间,写些评论,对后来下载的童鞋也是有帮助的,何乐而不为。* 大家的评论,我都会一个一个看的,也正是因为评论里面的支持,让我花费时间来上传一些自己的资料。只是平时不常登录,大家的问题也就不能及时回复,也就算了。* 相信一句话:山水有相逢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值