面试必刷算法TOP101之大数运算篇 TOP 20

大数相加

题目来源:牛客网

1、问题描述

以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
数据范围:s.length,t.length \le 100000s.length,t.length≤100000,字符串仅由’0’~‘9’构成
要求:时间复杂度 O(n)O(n)
示例:
在这里插入图片描述

2、思路解析

思路:模拟加法过程
(1)先确定循环次数,取最短字符串长度为循环次数
(2)在循环中逐位计算,记得保存进制位,直到计算循环结束
(3)计算多出来的字串和进制位之间的加法计算,同样还要保存进制位
(4)循环结束后还要检测进制位是否为0,不为0还要加上进制位
在这里插入图片描述
在这里插入图片描述

3、代码实现

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        if(s.empty()){
            return t;
        }else if(t.empty()){
            return s;
        }
        // write code here
        int i=0;
        int sum=0;
        string ss="";
        int n=s.size()-1,m=t.size()-1;
        while(n>=0&&m>=0){
            sum=s[n]-'0'+t[m]-'0'+i;
            if(sum>=10){
                sum-=10;
                i=1;
            }else{
                i=0;
            }
            char sh=sum+'0';
         ss.insert(ss.begin(),sh);
            n--;
            m--;
        }
        while(n>=0){
             sum=s[n]-'0'+i;
            if(sum>=10){
                sum-=10;
                i=1;
            }else{
                i=0;
            }
            char sh=sum+'0';
             ss.insert(ss.begin(),sh);
            n--;
        }
        while(m>=0){
             sum=t[m]-'0'+i;
            if(sum>=10){
                sum-=10;
                i=1;
            }else{
                i=0;
            }
            char sh=sum+'0';
             ss.insert(ss.begin(),sh);
            m--;
        }
        if(i==1){
            ss.insert(ss.begin(),i+'0');
        }
        return ss;
    }
};

大数乘法

题目来源:牛客网

1、题目描述

以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。
数据范围: 读入的数字大小满足 0 \le n \le 10^{1000}0≤n≤10 1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n^2)O(n 2 )
在这里插入图片描述

2、思路解析

思路:模拟乘法过程+大数加法
(1)从字符串s尾部开始取字符
(2)将拿到的字符去和字符串s逐位计算,保存进制位,将最后结果保存在字符换str中
(3)检测进制位是不是为0,不为0添加进制位
(4)扩大str 在str后边添加s.size()-1-i个0
(5)将扩大后的字符串str和ss进行大数加法运算结果保存在ss中
(6) 逐位拿到字符串s字符和字符串t计算,并进行大数加法

在这里插入图片描述

3、代码实现

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param s string字符串 第一个整数
     * @param t string字符串 第二个整数
     * @return string字符串
     */
    string solveadd(string s, string t) {
    if (s.empty()) {
        return t;
    }
    else if (t.empty()) {
        return s;
    }
    // write code here
    int i = 0;
    int sum = 0;
    string ss = "";
    int n = s.size() - 1, m = t.size() - 1;
    while (n >= 0 && m >= 0) {
        sum = s[n] - '0' + t[m] - '0' + i;
        if (sum >= 10) {
            sum -= 10;
            i = 1;
        }
        else {
            i = 0;
        }
        char sh = sum + '0';
        ss.insert(ss.begin(), sh);
        n--;
        m--;
    }
    while (n >= 0) {
        sum = s[n] - '0' + i;
        if (sum >= 10) {
            sum -= 10;
            i = 1;
        }
        else {
            i = 0;
        }
        char sh = sum + '0';
        ss.insert(ss.begin(), sh);
        n--;
    }
    while (m >= 0) {
        sum = t[m] - '0' + i;
        if (sum >= 10) {
            sum -= 10;
            i = 1;
        }
        else {
            i = 0;
        }
        char sh = sum + '0';
        ss.insert(ss.begin(), sh);
        m--;
    }
    if (i == 1) {
        ss.insert(ss.begin(), i + '0');
    }
    return ss;
}
    string solve(string s, string t) {
        if (s.size() == 1 && s[0] == '0') {
            return "0";
        }
        if (t.size() == 1 && t[0] == '0') {
            return "0";
        }
        // write code here
        string ss = "";
        for (int i = t.size() - 1;i >= 0;i--) {
            
            string str = "";
            int m = 0;
            for (int j = s.size() - 1;j >= 0;j--) {

                int sum = (t[i] - '0') * (s[j] - '0') + m;
                if (sum >= 10) {

                    m = sum / 10;
                    sum %= 10;
                }
                else {

                    m = 0;
                }
                char ch = sum + '0';
                str.insert(str.begin(), ch);
            }
            if (m > 0) {
                char ch = m + '0';
                str.insert(str.begin(), ch);
            }
            int n = t.size() - 1 - i;
            //扩大str
            while(n--) {
                str.push_back('0'); 
            }
            //大数相加
            ss = solveadd(ss, str);

        }
        return ss;
    }
};
  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自首的小偷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值