题目:输入两个数字字符串,如“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 + );
if (!ret) {
return NULL;
}
memset(ret, , Len + ); // multiply
for (int i = Len1 - ; i >= ; --i) {
for (int j = Len2 - ; j >= ; --j) {
int k = i + j + ;
// multiply digit by digit
ret[k] += (n1[i] - '') * (n2[j] - ''); // add to upper position
if (ret[k] >= ){
ret[k - ] += ret[k] / ;
ret[k] = ret[k] % ;
}
}
} // handle first 0
int d = ret[] == ? : ;
for (int i = ; i < Len - d; ++i) {
ret[i] = ret[i + d] + '';
}
ret[Len - d] = '\0'; return ret;
} int main(int argc, char* argv[])
{
char n1[] = "";
char n2[] = "";
char *ret = BigNumMultiply(n1, n2);
printf("%s * %s = %s\n", n1, n2, ret);
free(ret);
ret = NULL; getchar();
return ;
}

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

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”的区别

[笔记]一道C语言面试题:大整数乘法的更多相关文章

  1. [笔记]一道C语言面试题:IPv4字符串转为UInt整数

    题目:输入一个IPv4字符串,如“1.2.3.4”,输出对应的无符号整数,如本例输出为 0x01020304. 来源:某500强企业面试题目 思路:从尾部扫描到头部,一旦发现无法转换,立即返回,减少无 ...

  2. 转 C语言面试题大汇总

    转 C语言面试题大汇总,个人觉得还是比较全地!!! \主 题:   C语言面试题大汇总,个人觉得还是比较全地!!!  作 者:   free131 (白日?做梦!)   信 誉 值:   100    ...

  3. POJ 1001 解题报告 高精度大整数乘法模版

    题目是POJ1001 Exponentiation  虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...

  4. poj2389-Bull Math(大整数乘法)

    一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425  5 5 5  5 5 ...

  5. OpenJudge 2980 大整数乘法

    链接地址:http://bailian.openjudge.cn/practice/2980/ 题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的积 ...

  6. 大整数乘法python3实现

    因为python具有无限精度的int类型,所以用python实现大整数乘法是没意义的,可是思想是一样的.利用的规律是:第一个数的第i位和第二个数大第j位相乘,一定累加到结果的第i+j位上,这里是从0位 ...

  7. 【老鸟学算法】大整数乘法——算法思想及java实现

    算法课有这么一节,专门介绍分治法的,上机实验课就是要代码实现大整数乘法.想当年比较混,没做出来,颇感遗憾,今天就把这债还了吧! 大整数乘法,就是乘法的两个乘数比较大,最后结果超过了整型甚至长整型的最大 ...

  8. [大整数乘法] java代码实现

    上一篇写的“[大整数乘法]分治算法的时间复杂度研究”,这一篇是基于上一篇思想的代码实现,以下是该文章的连接: http://www.cnblogs.com/McQueen1987/p/3348426. ...

  9. Java开发笔记(二十九)大整数BigInteger

    早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...

随机推荐

  1. 初识Quartz(二)

    简单作业: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package quartz_pr ...

  2. SQL : IN 和 Exists 的区别

    Sql语句中IN和exists的区别及应用 表展示 首先,查询中涉及到的两个表,一个user和一个order表,具体表的内容如下: user表: order表: in 确定给定的值是否与子查询或列表中 ...

  3. nginx+python+fastcgi环境配置(flup版本)

    昨天花了一整天的时间研究搭建了nginx+python+fastcgi环境,并测试没问题,由于是第一次,并且参考了网上很多东西,网上也有很多,但还是把自己的过程记录下. 主要感谢这位兄弟的文章给了我很 ...

  4. EasyUI DataGrid 相同连续列合并

    扩展方法:$.extend($.fn.datagrid.methods, { autoMergeCells: function(jq, fields) { return jq.each(functio ...

  5. Spring MVC列表多选框

    以下示例显示如何在使用Spring Web MVC框架的表单中使用列表框(Listbox).首先使用Eclipse IDE来创建一个WEB工程,实现一个让用户可选择自己所善长的技术(多选)的功能.并按 ...

  6. eclipse 配置JDK

    JDK安装成功,eclipse也安装成功,这时候实际上是可以不配置JDK,因为系统已经默认给你配置好了,但是下面的情况需要配置:1.你系统中安装了多个JDK,某个项目工程需要更高版本的JDK等 工具/ ...

  7. hdu 1815(二分+2-sat)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1815 题意:给出n个牛棚.两个特殊点S1,S2的坐标.S1.S2直连.牛棚只能连S1或S2,还有,某些 ...

  8. 转载:DenseNet算法详解

    原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/a ...

  9. N - Broken Keyboard (a.k.a. Beiju Text)(DFS,链表)

    N - Broken Keyboard (a.k.a. Beiju Text) Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:% ...

  10. 64位matlab mex64位编译器解决方案

    安装libsvm的时候用到了mex -setup,有的会报 Could not find the 64-bit compiler. This may indicate that the "X ...