以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。
数据范围: 读入的数字大小满足
要求:空间复杂度
,时间复杂度
(假设m是n的长度)
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串 第一个整数
* @param t string字符串 第二个整数
* @return string字符串
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void addStr(char* a, char* b,int addlen,int multlen,int k){
addlen = addlen-k;
int i,j,tmp;
tmp = 0;
for(i=addlen-1,j=multlen-1;i>=0,j>=0;i--,j--){
tmp = (a[i] -'0') + (b[j]-'0') + tmp;
if (tmp>=10) {
a[i] = tmp%10 + '0';
tmp = 1;
}else if (tmp<10) {
a[i] = tmp + '0';
tmp = 0;
}
}
if (tmp > 0) {
a[j] = tmp +a[j];
}
return ;
}
char* multiStr(char x, char* y ){
int ylen = strlen(y);
int tmp = 0;
char* multmp = (char*)calloc(ylen + 1 , 1);
for (int i = 0; i< (ylen+1); i++) {
multmp[i]='0';
}
int multmplen = ylen+1;
for (int i = ylen - 1; i>=0; i--) {
tmp =tmp + (x-'0')*(y[i]-'0');
multmp[multmplen-1] = tmp % 10 + '0';
tmp = tmp / 10;
multmplen--;
}
if (tmp > 0) {
multmp[0] = multmp[0]+tmp;
}
// for (int i = 0; i< (ylen+1); i++) {
// printf("%c",multmp[i]);
// }
// printf("\n");
// while (*multmp == '0') {
// multmp++;
// }
return multmp;
}
char* solve(char* s, char* t ) {
// write code here
int slen = strlen(s);
int tlen = strlen(t);
char* multmp = (char*)calloc(tlen + 1 , 1);
char* addtmp = (char*)calloc(slen + tlen + 2 , 1);
for (int i = 0; i< (tlen+1); i++) {
multmp[i]='0';
}
for (int i = 0; i< (slen + tlen + 2); i++) {
addtmp[i]='0';
}
for (int i = slen-1 ; i>=0; i--) {
multmp = multiStr(s[i], t);
addStr(addtmp, multmp,slen + tlen + 2,tlen + 1,slen-i-1);
}
int n=0;
while (*addtmp == '0') {
addtmp++;
n++;
}
if (n == slen + tlen + 2) {
addtmp--;
}
// if (!addtmp) {
// return &addtmp[1];
// }
return addtmp;
} /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param s string字符串 第一个整数
* @param t string字符串 第二个整数
* @return string字符串
*/
char* solve(char* s, char* t ) {
int slen = strlen(s);
int tlen = strlen(t);
int rlen = slen + tlen;
char *r = (char *)malloc(slen + tlen + 1);
int i, j;
char sbit, tbit, carry, rbit;
memset(r, '0', rlen);
r[rlen] = '\0';
/* 执行乘法运算
* 123 (t)
*x 456 (s)
*-------
* 518 (r)
*/
for (i = 0; i < slen; i++) {
sbit = s[slen - i - 1];
carry = 0;
for (j = 0; j < tlen; j++) {
tbit = t[tlen - j - 1];
rbit = r[rlen - j - i - 1];
carry = (rbit - '0') + carry
+ (sbit - '0') * (tbit - '0');
r[rlen - j - i - 1] = (carry % 10) + '0';
carry /= 10;
}
r[rlen - tlen - i - 1] += carry;
}
if (carry == 0) {
return &r[1];
}
return r;
}