题目
题解(带注释)
char* addStrings(char* num1, char* num2) {//0 13404
int i = strlen(num1) - 1, j = strlen(num2) - 1, add = 0;
char* ans = malloc(sizeof(char) * (i + j + 5));
int ansLen = 0;
while (i >= 0 || j >= 0 || add != 0) {//i对应num1尾部数字,j对应num2尾部数字,add是进位
int x = i >= 0 ? num1[i] - '0' : 0;//到头了就赋0
int y = j >= 0 ? num2[j] - '0' : 0;
int result = x + y + add;
ans[ansLen++] = result % 10;
add = result / 10;
i--;
j--;
}
for (int i = 0; i < ansLen / 2; i++) {//正序
char t = ans[i];
ans[i] = ans[ansLen - 1 - i];
ans[ansLen - 1 - i] = t;
}
for (int i = 0; i < ansLen; i++) {//转换为字符
ans[i] += '0';
}
ans[ansLen++] = 0;//加终结符
return ans;
}
char* multiply(char* num1, char* num2) {
int m = strlen(num1), n = strlen(num2);//strlen 长度
char* ans = malloc(sizeof(char) * 2);//临时变量
ans[0] = '0', ans[1] = 0;//赋0
if ((m == 1 && num1[0] == '0') || (n == 1 && num2[0] == '0')) {//单独判断0的情况
return ans;
}
for (int i = n - 1; i >= 0; i--) {
char* curr = malloc(sizeof(char) * (n + m + 5));//n+m保证两数相乘不超范围,其实n+m就可以
int currLen = 0;//当前长度
int add = 0; //进位
for (int j = n - 1; j > i; j--) {//被乘数除个位外,都要补上对应数量的0,放在开头,反转后就扩大了对应的倍数
curr[currLen++] = 0;
}
int y = num2[i] - '0';//提取第i位数字
for (int j = m - 1; j >= 0; j--) {//将num1的每一位与num2[i]相乘
int x = num1[j] - '0';
int product = x * y + add;
curr[currLen++] = product % 10;
add = product / 10;
}
while (add != 0) {//最高位仍有进位,就将进位放入curr中
curr[currLen++] = add % 10;
add /= 10;
}
for (int i = 0; i < currLen / 2; i++) {//交换,将排列方式改为正序
char t = curr[i];
curr[i] = curr[currLen - 1 - i];
curr[currLen - 1 - i] = t;
}
for (int i = 0; i < currLen; i++) {//将数字转为字符,这样才能正常显示
curr[i] += '0';
}
curr[currLen++] = 0;//加终结符
char* tmp = addStrings(ans, curr);
free(ans), free(curr);
ans = tmp;
}
// return ans;
printf("%s",ans);
}
说明
这次我用的是c语言,其实真的没有c++方便,但有的学校的机试要求只能用c语言,所以被迫拾起了曾经的老友