Это правильный способ взять список из цифровых символов и использовать их для создания длинного целого числа? - PullRequest
1 голос
/ 07 апреля 2011

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

LongInt operator+(const LongInt& x, const LongInt& 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, преобразует их список в Long Ints, а затем складывает их вместе. Я знаю, что мне не хватает кода для объекта y, но я хотел убедиться, что у меня есть x, прежде чем я попытаюсь найти y.

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 07 апреля 2011

Нет, и я объяснил, как это сделать в вашем предыдущем потоке, за исключением того, что я ошибся с обратным итератором. Вы должны начать с начала, а не с конца. Извините за эту путаницу .. Этого должно быть достаточно:

   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.

0 голосов
/ 07 апреля 2011

Я что-то упускаю из-за перегрузки операторов (sp? :-)? Почему бы просто не забыть про xCount и просто:

long xValue = 0;
for(it = x.val.rbegin(); it != x.val.rend(); it++) 
{
  xValue = xValue * 10 + ( *it - '0');
}

При чем здесь xCount?

0 голосов
/ 07 апреля 2011

Если 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 и вернуть его.

0 голосов
/ 07 апреля 2011

В любом случае, вам нужно взять 10 ^ к мощности xCount (но вы нигде не увеличиваете его). xCount, вероятно, должно быть длиной вашего номера. Оператор if должен иметь == и быть if(xCount == 1), но вам не нужно это различать, потому что вы можете считать множитель первой цифры как 10 ^ 0.

"123" = 1*10^2+2*10^1+2*10^0
...