Является ли это допустимым способом взять список цифровых символов и использовать их для создания длинного целого числа?

#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