#c #list #operators #operator-overloading #long-integer
#c #Список #операторы #перегрузка оператора #длинное целое
Вопрос:
Является ли это допустимым способом взять список цифровых символов и использовать их для создания длинного целого числа?
LongInt operator (const LongIntamp; x, const LongIntamp; y)
{
int xCount = 1;
long int xValue = 0;
list<char>::iterator it;
//x.val is a list<char> that contains the digits needed to create the long int
for(it = x.val.begin(); it != x.val.end(); it )
{
xValue = xValue (*it - '0');
xCount ;
}
}
Цель xCount — отслеживать тип этого числа (1, 10, 100, 1000 и т.д.).
LongInt — это пользовательский класс, у которого есть список с именем val. Предполагается, что этот метод берет два объекта LongInt, преобразует их список в длинные целые числа, затем складывает их вместе. Я знаю, что мне не хватает кода для объекта y, но я хотел убедиться, что у меня есть x, прежде чем пытаться использовать y .
Заранее спасибо!
Ответ №1:
Нет, и я объяснил, как это сделать в вашей предыдущей теме, за исключением того, что я ошибся с обратным итератором. Вы должны начинать с начала, а не с конца. Извините за эту путаницу.. Этого должно быть достаточно:
list<char> digits;
digits.push_back('1');
digits.push_back('2');
digits.push_back('3');
long int xValue = 0;
list<char>::iterator it;
for(it = digits.begin(); it != digits.end(); it )
{
xValue = xValue * 10 (*it - '0');
}
Допустим, список {‘1′,’2’, ‘3’}. Изначально xvalue равно 0, затем оно становится 0*10 1 , которое равно 1. Тогда это 1*10 2 = 12. Последний 12 * 10 3 = 123.
Комментарии:
1. Мне это нравится, хотя это может вас испортить, если вы передадите ‘X’ в качестве одного из символов. (Я предполагаю, что проверка входных данных оставлена в качестве упражнения для читателя? 🙂 Также, возможно, стоит принять во внимание
-
знак.2. да, хорошо, эта часть «достаточно» в моем ответе вводит в заблуждение. Я имел в виду только упрощение тела цикла. конечно, там следует выполнить некоторую проверку и, как вы сказали, возможно, включить знак тоже.
3. Хорошо, я отредактировал свой вопрос, однако в цикле for я получаю ошибку с » = «, в которой говорится, что «Ни один оператор «=» не соответствует этим операндам. Есть идеи относительно того, почему это так?
4. хорошо, в какой строке ошибка? и что такое x.val? код, который я показал, работает очень хорошо. и кстати, в вашем отредактированном сообщении вы забыли умножить xValue на 10 перед добавлением (*it — ‘0’).
Ответ №2:
Если LongInt
это класс, который может иметь произвольную точность, он не может быть преобразован в примитивный тип данных типа long int xValue
.
Если вы хотите добавить два LongInt
s, то вам придется сделать это вручную. Символ за символом. Например, если x = «174», y = «43», то ваша программа выполнит следующее:
carry = 0;
174
43
^---- 4 3 carry = 7, carry = 0
174
43
^----- 7 4 carry = 1, carry = 1
174
43
^------ 1 0 carry = 2, carry = 0
Из приведенного выше алгоритма результатом является «217», который вы должны сохранить в другом LongInt
и вернуть это.
Комментарии:
1. Как бы я это настроил? Я не могу придумать способ перебирать значения каждого из них и складывать их вместе без вложенного цикла for , и это не сработает, потому что это взяло бы первое значение и добавило бы его ко всем значениям во втором числе.
2. @Ctak: вам не нужен никакой вложенный цикл. линейный цикл, подобный тому, который у вас есть сейчас, будет работать. подумайте об этом.
Ответ №3:
Я что-то упускаю о перегрузке оператора (sp? 🙂 ? Почему бы просто не забыть о xCount и просто:
long xValue = 0;
for(it = x.val.rbegin(); it != x.val.rend(); it )
{
xValue = xValue * 10 ( *it - '0');
}
Какое отношение к этому имеет xCount?
Ответ №4:
В любом случае вам нужно использовать значение 10 ^ в степени xCount (но вы нигде его не увеличиваете). xCount, вероятно, должен быть длиной вашего числа. Оператор if должен иметь ==
и быть if(xCount == 1)
, но вам не нужно это различать, потому что вы можете рассматривать множитель первой цифры как 10 ^ 0.
"123" = 1*10^2 2*10^1 2*10^0