【发布时间】:2020-01-18 17:36:31
【问题描述】:
我试图在两个字符串中进行乘法运算; 完成后,代码向我显示了 calloc 中所有“0”的答案。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
typedef char* verylong;
verylong input_long(void) {
int len = sizeof(char),size=0,c,i=0;
verylong num = malloc(len);
char ch;
size = len;
if (num != NULL) {
while ((c = getchar()) != '\n' && c != EOF) {
ch = (char)c;
if (isdigit(ch))
num[i++] = ch;
else
return NULL;
if (i == size) {
size = i + len;
if ((num = realloc(num, size)) == NULL)
return NULL;
}
}
}
else
return NULL;
num[i] = '\0';
return num;
}
verylong_multiply(verylong num1, verylong num2) {
int long1 = strlen(num1), long2 = strlen(num2);
verylong ret = calloc(long1 + long2 +1, sizeof(char));
_strrev(num1);
_strrev(num2);
int carry = 0;
for (int i = 0; i < long2; i++) {
int dig2 = num2[i]-'0';
carry = 0;
for (int j = 0; j < long1; j++) {
int dig1 = num1[j]-'0';
int temp = ret[i+j]-'0';
int cur = dig1 * dig2 + temp + carry;
ret[i+j] = cur % 10+'0';
carry = cur / 10;
}
if (carry>0)
ret[i+long1] = carry +'0';
}
_strrev(ret);
return ret;
}
void main() {
char* a = input_long();
char* b = input_long();
printf(multiply(a, b));
}
这是整个代码,输出似乎一直给我两个字符串 (10*10) 580 的答案,它不断添加 if '0' 的乘法(ascii 中的 48)。
【问题讨论】:
-
不再是“非常长”:(您应该解释该类型是一个类型化的字符指针 - 所有其他海报都这样做了。
-
我做了一个早期的功能,
-
如果我理解你的代码,它会将数字保存为字符数组,准备打印。考虑将数字存储在数组中作为相反方向的数值(“123”-> {3, 2, 1})以及结构中的数字大小,以简化计算。您可能在数学运算中更频繁地使用它们,而不仅仅是打印它们,因此“优化”这种用法是有意义的。
-
另外,如果
verylong是char *的typedef(这本身就是个坏主意),那么第一个return '0';是错误的。 -
代码保存的是计算后的数字,但是因为我使用“calloc”来构建新字符串,所以它保留了'0'。如果我制作 10*10,它会给我 580。100+10*'0'(480)
标签: c