[笔记]一道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 + );
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语言面试题:大整数乘法的更多相关文章
- [笔记]一道C语言面试题:IPv4字符串转为UInt整数
题目:输入一个IPv4字符串,如“1.2.3.4”,输出对应的无符号整数,如本例输出为 0x01020304. 来源:某500强企业面试题目 思路:从尾部扫描到头部,一旦发现无法转换,立即返回,减少无 ...
- 转 C语言面试题大汇总
转 C语言面试题大汇总,个人觉得还是比较全地!!! \主 题: C语言面试题大汇总,个人觉得还是比较全地!!! 作 者: free131 (白日?做梦!) 信 誉 值: 100 ...
- POJ 1001 解题报告 高精度大整数乘法模版
题目是POJ1001 Exponentiation 虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...
- poj2389-Bull Math(大整数乘法)
一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425 5 5 5 5 5 ...
- OpenJudge 2980 大整数乘法
链接地址:http://bailian.openjudge.cn/practice/2980/ 题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的积 ...
- 大整数乘法python3实现
因为python具有无限精度的int类型,所以用python实现大整数乘法是没意义的,可是思想是一样的.利用的规律是:第一个数的第i位和第二个数大第j位相乘,一定累加到结果的第i+j位上,这里是从0位 ...
- 【老鸟学算法】大整数乘法——算法思想及java实现
算法课有这么一节,专门介绍分治法的,上机实验课就是要代码实现大整数乘法.想当年比较混,没做出来,颇感遗憾,今天就把这债还了吧! 大整数乘法,就是乘法的两个乘数比较大,最后结果超过了整型甚至长整型的最大 ...
- [大整数乘法] java代码实现
上一篇写的“[大整数乘法]分治算法的时间复杂度研究”,这一篇是基于上一篇思想的代码实现,以下是该文章的连接: http://www.cnblogs.com/McQueen1987/p/3348426. ...
- Java开发笔记(二十九)大整数BigInteger
早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...
随机推荐
- java - day14 - InnerClass
内部类使用 package com.InnerClass; public class Mama { String name; Baby baby; Mama(String name){ this.na ...
- codeblocks中给GCC编译器加参数
在使用gcc命令行编译的时候可以使用gcc xxx.c -o xxx.exe -std=c99来使用c99标准编译 但是在codeblocks中默认是不使用c99标准编译的,如何加参数呢? Setti ...
- windows下mysql表名不自动转换小写配置
mysql5.6版本配置文件有两个 1.默认的配置在program files/MySQL/MySQL Server 5.6/my-default.ini 2.一个在programData/MySQL ...
- HTML— 弹出遮盖层
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- sscanf
#include<stdio.h> 1.sscanf和scanf的不同是输入来源,前者是一个字符串,后者则是标准输入设备 2.sscanf的使用,以解析时间字符串为例,将字符串“2009- ...
- python3----strip lstrip rstrip
Python中的strip用于去除字符串的首位字符,同理,lstrip用于去除左边的字符,rstrip用于去除右边的字符.这三个函数都可传入一个参数,指定要去除的首尾字符.注意的是,传入的是一个字符数 ...
- 第1周---python网络爬虫规则
第一节:requests库入门 第二节:网络爬虫的"盗亦有道" 第三节:requests库的网络爬虫实例
- laravel Lumen邮箱发送配置
Lumen 中配置邮件 https://blog.csdn.net/glovenone/article/details/54344013 Lareval 比 Lumen 多了一个步骤 https:// ...
- [Unity基础]移动平台下的文件读写
From:http://blog.csdn.net/lyh916/article/details/52161633 参考链接: http://www.cnblogs.com/murongxiaopif ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.1——编写自己的任务
问题: 你想用自己的任务定制gradle的构建过程. 解决方案: 在gradle的build文件里面增加task元素.用Android插件支持的extra属性使得开发更容易. 讨论: Gradle的D ...