列表

详情


NC10. 大数乘法

描述

以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。

数据范围: 读入的数字大小满足 
要求:空间复杂度 ,时间复杂度

示例1

输入:

"11","99"

输出:

"1089"

说明:

11*99=1089

示例2

输入:

"1","0"

输出:

"0"

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-06-02

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param s string字符串 第一个整数
 * @param t string字符串 第二个整数
 * @return string字符串
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
char* solve(char* s, char* t ) {
    // write code here
    int sl = strlen(s);
    int tl = strlen(t);
    int rs[sl+tl];
    for(int i=0;i<(sl+tl);i++){
        rs[i] = 0;
    }
    char *result = (char*)malloc((sl + tl) * sizeof(char));
    for (int i=0;i<sl;i++){
        for (int j=0;j<tl;j++){
            rs[i+j+1] += (s[i] - '0') * (t[j] - '0');
        }
    }
    for (int i=(sl+tl-1); i>0;i--) {
        result[i] = rs[i] % 10 + '0';
        rs[i - 1] += rs[i] / 10;
    }
    result[0] = rs[0] + '0';
    for (int i=0;i<(sl+tl); i++) {
        if(*result != '0' || i == (sl + tl - 1)){
            break;
        }else{
            result++;
        }
    }
    return result;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 408KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param s string字符串 第一个整数
     * @param t string字符串 第二个整数
     * @return string字符串
     */
    string toString(vector<int>& num){
        bool iszero = true;
        string res{};
        for (int i = 0; i < num.size(); i++){
            if(num[i] > 0){
                iszero = false;
            }
            if(!iszero){
                res += to_string(num[i]);
            }
        }
        if(res.empty()){
            return "0";
        }
        return res;
    }
    string solve(string s, string t) {
        // write code here
        reverse(s.begin(), s.end());
        reverse(t.begin(), t.end());
        int len1 = s.size();
        int len2 = t.size();
        vector<int> num(len1 + len2, 0);
        for (int i = 0; i < len1; i++){
            for (int j = 0; j < len2; j++){
                num[i+j] += (s[i] - '0')*(t[j] - '0');
            }
        }
        int carry = 0;
        for (int i = 0; i < len1 + len2; i++){
            num[i] = num[i] + carry;
            carry = num[i] / 10;
            num[i] = num[i] % 10;
        }
        if(num.back() == 0){
            num.erase(num.end() - 1);
        }
        reverse(num.begin(), num.end());
        return toString(num);
        
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 408KB, 提交时间: 2022-04-22

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param s string字符串 第一个整数
     * @param t string字符串 第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        // write code here
        int sl = s.length(), tl = t.length();
        if(s == "0" || t == "0") return "0";
        else if(sl == 1 && tl == 1) return to_string(stoi(s) * stoi(t));
        reverse(s.begin(), s.end());
        reverse(t.begin(), t.end());
        vector<int> list(sl + tl);
        for(int i = 0; i < sl; i++) {
            for(int j = 0; j < tl; j++) {
                int si = s[i] - '0', ti = t[j] - '0';
                list[i + j] += si * ti;
            }
        }
//         for(int i = 0; i < sl + tl; i++) {
//             cout << list[i];
//         }
        string res = "";
        for(int i = 0; i < sl + tl; i++) {
            if(list[i] > 9) {
                list[i+1] += list[i] / 10;
                list[i] %= 10;
            }
        }
        for(int c:list) res += c + '0';
        reverse(res.begin(), res.end());
        if(res[0] == '0') res = res.substr(1);
        return res;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-06-11

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

C++ 解法, 执行用时: 3ms, 内存消耗: 436KB, 提交时间: 2021-09-07

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param s string字符串 第一个整数
     * @param t string字符串 第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        // write code here
        int slen = s.size();
        int tlen = t.size();
        if(slen == 0 || tlen == 0) return "";
        if(s=="0" || t == "0") return "0";
        int len = slen + tlen-1;
        int num[len];
        for(int i=0;i<len;i++) num[i] = 0; //初始赋值很重要
        for(int i=0;i<slen;i++)
        {
            for(int j=0;j<tlen;j++)
                num[i+j] += (s[i]-'0') * (t[j] - '0');
        }
       //int end = num[0]==0?1:0;
        string res;
        int carry = 0;
        for(int i=len-1;i>=0;i--)
        {
            int tmp = num[i] + carry;
            res.append(1,tmp%10 + '0');
            carry = tmp/10;
        }
        if(carry != 0)
            res.append(1,carry + '0');
        reverse(res.begin(), res.end());
        while(res[0] == '0') res = res.substr(1); //这个也很重要。
        return res;
    }
};

上一题