#c
#c
Вопрос:
У меня есть задание, в котором я должен суммировать целые числа до 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 digitResu<
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, amp;result->string[index], 10); //I think this is the problem
index--;
}
result->string[limit] = '';
printf("result: %sn", result->string);
return resu<
}
Я не закончил писать эту функцию, я знаю, что в ней много недостатков, но проблема в том, что я не могу получить сумму 12 12. Результат, который я получаю, равен 2.
Я думал подойти к этой проблеме, выбрав последний символ обоих чисел, преобразовать их в an int
и суммировать их, имея в виду цифру переноса. После того, как я получил результат, digitResult
я пытаюсь преобразовать его в символ и сохранить его в соответствующей позиции result->string
указателя
Как только он завершит операцию, я добавляю
в последнюю позицию result->string
.
Итак, вопрос в том, как мне заставить эту операцию работать по желанию? Отлаживая код, я заметил, что при первом сохранении первого результата в result->string, следуя приведенному выше примеру, это будет число 4, вместо этого он сохраняет мусор в этой позиции. Во втором добавлении я правильно сохраняю число 2, и это конечный результат, который я получаю при печати результата.
Комментарии:
1. Что такое
resultado
?2. Я сожалею, что изначально он был написан на испанском языке и забыл переименовать эти переменные, я отредактирую вопрос
3. Вы уверены, что и
num1->string[limit-1]
то, иnum2->string[limit-1]
другое не находятся вне зоны досягаемости?4. Забудьте об itoa. Если
((int)num1->string[index]) - ((int)'0');
преобразовать из ASCII в целое число, то, естественно, вы можете сделать'0'
, чтобы пойти наоборот.5. Требуют ли ваши инструкции, чтобы вы использовали
struct BigNumber
их повсюду, или вам будет разрешено использовать более эффективные процессы для выполнения суммы от 1 до 100, а затем просто преобразовать ее обратно в одинBigNumber
раз в конце? Или это было бы мошенничеством в этой ситуации?
Ответ №1:
Ваше использование itoa
функции является проблемой (хотя, как вы также предположили, возможно, не единственной).
itoa
Функция преобразует свой первый аргумент в строку с нулевым завершением — таким образом, помимо записи символьного представления digitResult
в указанном месте строки, она также добавляет ''
символ после него. Таким образом, ваша строка всегда будет заканчиваться сразу после последней введенной вами цифры, а 12
12
, дающий 24
, будет казаться только первым символом : 2
.
Вместо этого вы можете самостоятельно преобразовать цифру (изменив операцию, которую вы использовали для получения значений d1
and d2
), а затем просто напрямую присвоить элементу string преобразованную цифру.
Итак, вместо:
itoa(digitResult, amp;result->string[index], 10);
использование:
result->string[index] = (char)(digitResult '0');