我试图在两个字符串中进行乘法; 完成后,代码向我显示了答案,其中包含来自 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)。
最佳答案
除了算法和数据结构的总体设计之外,还有几个问题(一个将大小与数字数组一起存储的结构,从最低有效位开始,可以简化所有计算)。
verylong_multiply(verylong num1, verylong num2) {
if (strlen(num1) == 0 || strlen(num2) == 0) return '0';
这里至少存在复制粘贴错误,要么函数是verylongmultiply(...)
,要么缺少返回类型。另外,如果我们假设(我们不应该)verylong
是 char *
的 typedef,那么 return '0';
就是简单的错误的。 '0'
是 char
,而不是 char *
。
在整个代码段中,'0'
、'\0'
和 NULL
之间似乎存在混淆。
这一行
verylong ret = calloc(sizeof(char) , long1 + long2 + 1);
// ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ Those should be switched
将分配数组并用零填充它,而不是'0'
。
如果你想用'0'
填充它(除了空终止符),你可以使用
memset(ret, '0', long1 + long2);
这样,在稍后的代码中,您也可以更改此行
int temp = ret[i+j]; // --> int temp = ret[i+j] - '0';
int cur = dig1 * dig2 + temp + carry;
ret[i+j] = cur % 10 + '0';
Thrn,在反转字符串并返回它之前,您可以将最终的最后一个 '0'
转换为 '\0'
,以避免出现 >10 * 123 = 01230
而不是 1230
。
请注意,所选的数据结构会强制您在每次调用此函数时反转表示数字的字符串并计算它们的长度,并且您还应该将它们反转回原始状态,如果您计划再次使用它们。
关于c - 计算后从字符串中删除 '0',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59803166/