首页 > 试题广场 >

大数乘法

[编程题]大数乘法
  • 热度指数:32160 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。

数据范围: 读入的数字大小满足 

要求:空间复杂度 O(m),时间复杂度 O(m^2)假设m是n的长度
示例1

输入

"11","99"

输出

"1089"

说明

11*99=1089 
示例2

输入

"1","0"

输出

"0"
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 第一个整数
 * @param t string字符串 第二个整数
 * @return string字符串
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void addStr(char* a, char* b,int addlen,int multlen,int k){
    addlen = addlen-k;
    int i,j,tmp;
    tmp = 0;
    for(i=addlen-1,j=multlen-1;i>=0,j>=0;i--,j--){
        tmp = (a[i] -'0') + (b[j]-'0') + tmp;
        if (tmp>=10) {
            a[i] = tmp%10 + '0';
            tmp = 1;
        }else if (tmp<10) {
            a[i] = tmp + '0';
            tmp = 0;
        }
    }
    if (tmp > 0) {
        a[j] = tmp +a[j];
    }

    return ;
}
char* multiStr(char x, char* y ){
    int ylen = strlen(y);
    int tmp = 0;
    char* multmp = (char*)calloc(ylen + 1 , 1);
    for (int i = 0; i< (ylen+1); i++) {
        multmp[i]='0';
    }
    int multmplen = ylen+1;
    for (int i = ylen - 1; i>=0; i--) {
        tmp =tmp + (x-'0')*(y[i]-'0');
        multmp[multmplen-1] = tmp % 10 + '0';
        tmp = tmp / 10;
        multmplen--;
    }
    if (tmp > 0) {
        multmp[0] = multmp[0]+tmp;
    }
    // for (int i = 0; i< (ylen+1); i++) {
    //     printf("%c",multmp[i]);
    // }
    // printf("\n");
    // while (*multmp == '0') {
    //     multmp++;
    // }
    return multmp;
}
char* solve(char* s, char* t ) {
    // write code here
    int slen = strlen(s);
    int tlen = strlen(t);
    char* multmp = (char*)calloc(tlen + 1 , 1);
    char* addtmp = (char*)calloc(slen + tlen + 2 , 1);
    for (int i = 0; i< (tlen+1); i++) {
        multmp[i]='0';
    }
    for (int i = 0; i< (slen + tlen + 2); i++) {
        addtmp[i]='0';
    }
    for (int i = slen-1 ; i>=0; i--) {
            multmp = multiStr(s[i], t);
            addStr(addtmp, multmp,slen + tlen + 2,tlen + 1,slen-i-1);
    }

    int n=0;
    while (*addtmp == '0') {
        addtmp++;
        n++;
    }
    if (n == slen + tlen + 2) {
        addtmp--;
    }
    // if (!addtmp) {
    //     return &addtmp[1];
    // }
    return addtmp;
}

发表于 2024-10-16 16:20:47 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param s string字符串 第一个整数
 * @param t string字符串 第二个整数
 * @return string字符串
 */
char* solve(char* s, char* t ) {
    int slen = strlen(s);
    int tlen = strlen(t);
    int rlen = slen + tlen;
    char *r = (char *)malloc(slen + tlen + 1);
    int i, j;
    char sbit, tbit, carry, rbit;

    memset(r, '0', rlen);
    r[rlen] = '\0';

    /* 执行乘法运算
     *  123   (t)
     *x 456   (s)
     *-------
     *  518   (r)
     */
    for (i = 0; i < slen; i++) {
        sbit = s[slen - i - 1];
        carry = 0;

        for (j = 0; j < tlen; j++) {
            tbit = t[tlen - j - 1];
            rbit = r[rlen - j - i - 1];

            carry = (rbit - '0') + carry
                                 + (sbit - '0') * (tbit - '0');
            r[rlen - j - i - 1] = (carry % 10) + '0';
            carry /= 10;
        }

        r[rlen - tlen - i - 1] += carry;
    }
    
    if (carry == 0) {
        return &r[1];
    }

    return r;
}

发表于 2021-11-07 07:23:07 回复(0)