内容简介:题目:输入两个数字字符串,如“1234567890”和“987654321”,返回二者相乘的结果字符串,如本例返回为“1219326311126352690”。来源:某500强企业面试题目思路:从尾部到头部,对两个字串的每个数字分别相乘,并放入结果字符串相应的位置。
题目:输入两个数字字符串,如“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] = '\0'; return ret; } int main(int argc, char* argv[]) { char n1[] = "1234567890"; char n2[] = "987654321"; char *ret = BigNumMultiply(n1, n2); printf("%s * %s = %s\n", 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”的区别
Linux公社的RSS地址 : https://www.linuxidc.com/rssFeed.aspx
本文永久更新链接地址: https://www.linuxidc.com/Linux/2019-05/158424.htm
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Beginning ASP.NET 4 in C# and Vb
Imar Spaanjaars / Wrox / 2010-3-19 / GBP 29.99
This book is for anyone who wants to learn how to build rich and interactive web sites that run on the Microsoft platform. With the knowledge you gain from this book, you create a great foundation to ......一起来看看 《Beginning ASP.NET 4 in C# and Vb》 这本书的介绍吧!