以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。
数据范围: 读入的数字大小满足
要求:空间复杂度 ,时间复杂度 (假设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; }