zoukankan      html  css  js  c++  java
  • [笔记]一道C语言面试题:大整数乘法

    题目:输入两个数字字符串,如“1234567890”和“987654321”,返回二者相乘的结果字符串,如本例返回为“1219326311126352690”。

    来源:某500强企业面试题目

    思路:从尾部到头部,对两个字串的每个数字分别相乘,并放入结果字符串相应的位置。

    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
    
    char *BigNumMultiply(const char *n1, const char *n2)
    {
        // quit if n1 or n2 is invalid
        if (!n1 || !n2) {
            return NULL;
        }
    
        // get length
        int Len1 = strlen(n1);
        int Len2 = strlen(n2);
        int Len = Len1 + Len2;
    
        // allocate result buffer
        char *ret = (char *)malloc(Len + 1);
        if (!ret) {
            return NULL;
        }
        memset(ret, 0, Len + 1);
    
        // multiply
        for (int i = Len1 - 1; i >= 0; --i) {
            for (int j = Len2 - 1; j >= 0; --j) {
                int k = i + j + 1;
                // multiply digit by digit
                ret[k] += (n1[i] - '0') * (n2[j] - '0');
                
                // add to upper position
                if (ret[k] >= 10){
                    ret[k - 1] += ret[k] / 10;
                    ret[k] = ret[k] % 10;
                }
            }
        }
    
        // handle first 0
        int d = ret[0] == 0 ? 1 : 0;
        for (int i = 0; i < Len - d; ++i) {
            ret[i] = ret[i + d] + '0';
        }
        ret[Len - d] = '';
    
        return ret;
    }
    
    int main(int argc, char* argv[])
    {
        char n1[] = "1234567890";
        char n2[] = "987654321";
        char *ret = BigNumMultiply(n1, n2);
        printf("%s * %s = %s
    ", n1, n2, ret);
        free(ret);
        ret = NULL;
    
        getchar();
        return 0;
    }

    从工程化角度考虑,有几点需要注意:

    1、输入的字符串是否有效?
        上面的代码只判断了是否为空,实际上还有可能输入的字符串并非有效的数字字符串,如“12gh34”,这种也需要返回NULL。

    2、前导0的处理
        a位数与b位数相乘,结果长度可能为a+b,如9*99=891;也可能a+b-1是如 10*100=1000。
        在代码的最后部分,对a+b-1的类型进行了移位处理,压缩掉了前导的0。

    从编程角度考虑,有几点需要注意:

    1、字符串下标从小到大,是从高位到低位。如n=“123”,最高位n[0]=1,最低位n[2]=3。

    2、字符ASCII码与字符的转换,如n[3]=5这是纯数字,而+'0'后有n[3]='5'这就是字符了。

    3、数字交叉相乘的进位处理,通过 >=10来判断进位,此处注意不要写成>10;另外注意多次叠加,所以使用 +=

    4、malloc()的返回值是(void *),为了让编译器happy,需要强制转为(char *),而且最后需要free来释放它申请的内存。

    5、字符'0'和字符串“0”的区别

  • 相关阅读:
    bootstrap-table设置表头宽度无效的解决方案
    bootstrap-table设置某列序号自增
    arguments.callee
    javascript中break和continue
    javascript数据类型
    <script>标签的属性
    javascript核心
    javascript中数据属性与访问器属性
    解决ie9以下下不支持html5和媒体查询(Media Queries)
    用firefox获取html页面元素的Xpath
  • 原文地址:https://www.cnblogs.com/journeyonmyway/p/3871299.html
Copyright © 2011-2022 走看看