前一段时间一直都是做力扣的简单题后来不小心打开了这道中等题,一看这不挺简单嘛,一做才发现不对劲,后来看了一下提示花了三天才把它写出来并改正。
刚开始做这道题的时候简单的以为就是两个数相乘无非就是把两个字符串里面的字符转换成对应位数的数字相加后两者相乘不就行了,后来发现竟然值溢出了,无所谓嘛可能是范围提供的小了,到最后使用unsigned long long还溢出,才发现事情不对,再看题干,人家给的字符串长度最高到了二百,这种做法显然是错的了,思考了很长时间打开人家的官方提示看了一下,需要用到平时两数相乘时手算的方法,才能把这道题解出来。耗费了我三天啊...
附上代码:(好像有点挫..)
char * multiply(char * num1, char * num2){
if(num1[0]=='0'||num2[0]=='0')//这里如果两个字符串有一个是字符零的话,直接返回字符零
{
char* arr=malloc(sizeof(char)*2);
memset(arr,'\0',sizeof(char)*2);
arr[0]='0';
return arr;
}
int length1 = strlen(num1)-1;//计算两个字符串的长度
int length2 = strlen(num2)-1;
int sum = 0;
int n = 0;
int tmp = 0;
int* number = malloc(sizeof(int)*(length1 + length2 + 2));//开辟空间先将算出的乘数填入数字数组里
memset(number, 0, (sizeof(int))* (length1 + length2 + 2));
int i = 0;
for (i = length1; i >= 0; i--)//这里的循环体现了手算两数相乘的过程
{
int j = 0;
for (j = length2; j >= 0; j--)
{
sum = (num2[j] - 48) * (num1[i] - 48);
int k = 0;
while (sum)
{
number[length1 + j - n - k+1] += sum % 10;
sum /= 10;
k++;
}
int y = 0;
tmp = length1 + length2 -y+1;
while (tmp)
{
int x = 0;
if (number[tmp] > 9)
{
x = number[tmp];
number[tmp] = x % 10;
x /= 10;
number[tmp - 1] += x;
}
tmp--;
}
y++;
}
n += 1;
}
char* str;
if (number[0] == 0)//这里要分情况的原因是两数相乘得到的数的位数一定是两个数的位数之和或者在此基础上加一,分配数组空间时就分配的是length1+length2+1个int
{
str = malloc(sizeof(char) * length1 + length2 + 2);
memset(str, '\0', length1 + length2 + 2);//这里一定要初始化成斜杠零(或者数字零),我就是当时初始化成字符零一直报错,我都找不出问题,一顿好找
for (i = length1 + length2; i >= 0; i--)
{
str[i] = number[i + 1]+48;
}
}
else
{
str= malloc(sizeof(char) * length1 + length2 + 3);
memset(str, '\0', length1 + length2 + 3);
for (i = length1 + length2+1; i >= 0; i--)
{
str[i] = number[i ] + 48;
}
}
return str;
}