题解 | #字符串相乘#
字符串相乘
http://www.nowcoder.com/practice/ff74b3d786de4a30b4cd49b8ad97467f
描述
给定两个数字(0-9)字符串(长度不限)求它们的乘积。
输入描述:
第一行为第一个数字字符串
第二行为第二个数字字符串
输出描述:
乘积字符串
示例1
输入123
20
输出2460
题解:核心思想已经加粗,着急看题解的朋友可以直接看粗体内容
首先字符串相乘,首先考虑将其转换为整型数再进行乘法运算。在c语言中,标准库#include<stdlib.h>文件中,提供了标准函数atoi函数(ascii to integer)atol函数(ascii to long integer),用于字符串转换数字串。
在c++标准库#include中也提供了相应的std函数,由于本篇主讲c语言,c++函数就不过多描述了。
其次,我们提交代码之后会发现,测试点中存在030,020这样的案例,所以我们并不能直接使用转换函数一了了之,于是我们可以先择把一个字符串中大于零的字符和零分开,将大于零的字符串转换成数字相乘输出,然后统计两个字符串中零的个数,然后在乘积的末尾循环输出所有的零,这样便把超过c语言最大long long int的数据也轻松拆分了。
附上源码:
#include<stdio.h> #include<string.h> #include<stdlib.h> int main() { char a[1000],b[1000],t[1000]; int i,j=0,sum=0; long a_,b_; gets(a); gets(b); for(i=0;i<strlen(a);i++) { if(a[i]>='1'&&a[i]<='9') t[j++]=a[i]; else if(a[i]=='0'&&j>0) sum++; } t[j]='\0'; j=0; a_=atol(t); for(i=0;i<strlen(b);i++) { if(b[i]>='1'&&b[i]<='9') t[j++]=b[i]; else if(b[i]=='0'&&j>0) sum++; } t[j]='\0'; b_=atol(t); printf("%ld",a_*b_); for(i=0;i<sum;i++) printf("0"); return 0; }