我有一个作业,我必须将整数加起来最多100个数字。
他们给了我这个代表大数字的结构(我认为有更好的方法来代表这个数字,但是我不允许对其进行修改):
typedef struct {
char* string;
int lengthError;
} BigNumber;
其中string
是该数字本身和lengthError
是数字或者说是具有先前定义枚举错误的长度。
我也有sum函数的实现
BigNumber *sum(BigNumber* num1, BigNumber* num2) {
BigNumber* result = malloc(sizeof(BigNumber));
int limit = getLength(num1->lengthError, num2->lengthError);
result->string = malloc(limit);
int digitResult;
int index = limit -1;
int carry = 0;
while(index != -1) {
int d1 = ((int)num1->string[index]) - ((int)'0');
int d2 = ((int)num2->string[index]) - ((int)'0');
digitResult = d1 + d2 + carry;
if (digitResult > 9) {
digitResult = digitResult - 10;
carry = 1;
} else {
carry = 0;
}
itoa(digitResult, &result->string[index], 10); //I think this is the problem
index--;
}
result->string[limit] = '\0';
printf("result: %s\n", result->string);
return result;
}
我尚未完成该函数的编写,我知道其中存在很多缺陷,但是问题是我无法求和12 +12。我得到的结果是2。
我想通过选择两个数字的尾数来解决这个问题,将它们转换成anint
并考虑进位数字来求和。在得到结果之后,digitResult
我尝试将其转换为char并将其存储在result->string
指针的相应位置
完成操作后,我\0
在的最后位置添加result->string
。
因此,问题是,如何使该操作按需工作?调试代码时,我注意到它第一次将第一个结果存储在result-> string中,在上面的示例中,它是一个数字4,它将垃圾存储在该位置。在第二个结果中,我正确地存储了数字2,这是我打印结果时得到的最终结果。
您对itoa
功能的使用是一个问题(尽管,正如您还建议的那样,也许不是唯一的问题)。
该itoa
函数将其第一个参数转换为以空值终止的字符串-因此,除了digitResult
在字符串的指定位置写入字符表示形式外,它还会在其后添加一个'\0'
字符。因此,您的字符串将始终在您写入的最后一位数字之后立即终止,而12
+12
给出的值24
似乎只是第一个字符:2
。
您可以做的是自己转换数字(反转用于获取d1
和d2
值的操作),然后直接将字符串元素设置为转换后的数字。
因此,代替:
itoa(digitResult, &result->string[index], 10);
采用:
result->string[index] = (char)(digitResult + '0');
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句