#include <stdio.h>
#include <string.h>
void multiply(char num1[], char num2[], char result[]) {
int len1 = strlen(num1);
int len2 = strlen(num2);
// 结果最大位数不超过两个乘数位数之和
int resultSize = len1 + len2;
int res[resultSize];
for (int i = 0; i < resultSize; i++) {
res[i] = 0;
}
for (int i = 0; i < len1; i++) {
for (int j = 0; j < len2; j++) {
int digit1 = num1[len1 - 1 - i] - '0';
int digit2 = num2[len2 - 1 - j] - '0';
res[i + j] += digit1 * digit2;
}//没有将num1 num2倒过来 而是直接倒着一个个分离出最低位 储存其值并在相乘之后加到相应的位置
}
for (int i = 0; i < resultSize - 1; i++) {
res[i + 1] += res[i] / 10;
res[i] %= 10;
}//进位处理
int i = resultSize - 1;
while (i > 0 && res[i] == 0) {
i--;
}//统计位数 这里的400是以004(从左到右序数增大)的方式储存的 所以从最大序数位置(为0)开始检查 检查到第一个非0的就停止
int index = 0;
while (i >= 0) {
result[index++] = res[i] + '0';
i--;//将res倒序复制到result并转化为符号类型的数字
}
result[index] = '\0';
}
int main()
{
char num1[1001];
char num2[1001];
char result[2002];
scanf("%s", num1);
scanf("%s", num2);
if (strcmp(num1, "0") == 0 || strcmp(num2, "0") == 0) {
printf("0\n");
return 0;
}
multiply(num1, num2, result);
printf("%s\n", result);
return 0;
}
以下的代码是有问题的 因为它是这样储存的:20x20 以 400(左到右是低到高位)储存在result当中,而004前面都是0 会导致无法统计位数 而影响倒过来的结果
#include <stdio.h>
#include <string.h>
void multiply(char num1[], char num2[], char result[])
{
int a = strlen(num1);
int b = strlen(num2);
// 数组大小需要考虑进位
int temp_result[a + b];
for (int i = 0; i < a + b; i++) {
temp_result[i] = '0';
}
for (int i = 0; i < a; i++) {
for (int j = 0; j < b; j++) {
temp_result[i + j] += (num1[i] - '0') * (num2[j] - '0');
if (temp_result[i + j] >= 10) {
temp_result[i + j + 1] += temp_result[i + j] / 10;
temp_result[i + j] %= 10;
}
}
}
int i = a + b - 1;
while (i > 0 && temp_result[i] == '0') {
i--;
}
for (int j = 0; j <= i; j++) {
result[j] = temp_result[i - j] + '0'; // 修正这里
}
result[i + 1] = '\0';
}
int main()
{
char num1[1001];
char num2[1001];
char result[2002];
scanf("%s", num1);
scanf("%s", num2);
if (strcmp(num1, "0") == 0 || strcmp(num2, "0") == 0) {
printf("0\n");
return 0;
}
multiply(num1, num2, result);
printf("%s\n", result);
return 0;
}