关于leetcode里的43.字符串相乘(C语言)

  前一段时间一直都是做力扣的简单题后来不小心打开了这道中等题,一看这不挺简单嘛,一做才发现不对劲,后来看了一下提示花了三天才把它写出来并改正。

  刚开始做这道题的时候简单的以为就是两个数相乘无非就是把两个字符串里面的字符转换成对应位数的数字相加后两者相乘不就行了,后来发现竟然值溢出了,无所谓嘛可能是范围提供的小了,到最后使用unsigned long long还溢出,才发现事情不对,再看题干,人家给的字符串长度最高到了二百,这种做法显然是错的了,思考了很长时间打开人家的官方提示看了一下,需要用到平时两数相乘时手算的方法,才能把这道题解出来。耗费了我三天啊...

附上代码:(好像有点挫..)

char * multiply(char * num1, char * num2){
    if(num1[0]=='0'||num2[0]=='0')//这里如果两个字符串有一个是字符零的话,直接返回字符零
    {
        char* arr=malloc(sizeof(char)*2);
        memset(arr,'\0',sizeof(char)*2);
        arr[0]='0';
        return arr;
    }
    int length1 = strlen(num1)-1;//计算两个字符串的长度
    int length2 = strlen(num2)-1;
    int sum = 0;
    int n = 0;
    int tmp = 0;
    int* number = malloc(sizeof(int)*(length1 + length2 + 2));//开辟空间先将算出的乘数填入数字数组里
    memset(number, 0, (sizeof(int))* (length1 + length2 + 2));
        int i = 0;
    for (i = length1; i >= 0; i--)//这里的循环体现了手算两数相乘的过程
    {
        int j = 0;
        for (j = length2; j >= 0; j--)
        {
            sum = (num2[j] - 48) * (num1[i] - 48);
            int k = 0;
            while (sum)
            {
                number[length1 + j - n - k+1] += sum % 10;
                sum /= 10;
                k++;
            }
            int y = 0;
            tmp = length1 + length2 -y+1;
            while (tmp)
            {
                int x = 0;
                if (number[tmp] > 9)
                {
                    x = number[tmp];
                    number[tmp] = x % 10;
                    x /= 10;
                    number[tmp - 1] += x;
                    
                }
                tmp--;
            }
            y++;
        }
        n += 1;
    }
    char* str;
    
    if (number[0] == 0)//这里要分情况的原因是两数相乘得到的数的位数一定是两个数的位数之和或者在此基础上加一,分配数组空间时就分配的是length1+length2+1个int
    {
        str = malloc(sizeof(char) * length1 + length2 + 2);
        memset(str, '\0', length1 + length2 + 2);//这里一定要初始化成斜杠零(或者数字零),我就是当时初始化成字符零一直报错,我都找不出问题,一顿好找
        for (i = length1 + length2; i >= 0; i--)
        {
            str[i] = number[i + 1]+48;
        }
    }
    else
    {
        str= malloc(sizeof(char) * length1 + length2 + 3);
        memset(str, '\0', length1 + length2 + 3);
        for (i = length1 + length2+1; i >= 0; i--)
        {
            str[i] = number[i ] + 48;
        }
    }
    return str;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值