Вычисление одного из числа представляет собой вектор? - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь уменьшить число, которое может быть бесконечно длинным и представлено в векторе, на 1. В качестве небольшого примера:

vector<int> v1 = {5, 0, 0, 0};

После вычитания одного из конца, результат должен be:

vector<int> v1 = {4, 9, 9, 9};

Это мой текущий код:

int size = v1.size();
bool carry = false;

for (int i = size - 1; i > 0; i--) {
    if (v1.at(i) == 0) {
        v1.at(i) = 9;

        if (v1.at(0) == 1) {
            v1.at(0) = 0;
        }

        carry = true;
    } else {
        v1.at(i) -= 1;
        carry = false;
    }
}

if (carry == true && v1.at(0) == 0) {
    v1.erase(v1.begin());
} else if (carry == true) {
    v1.at(0) -= 1;
}

return v1;

Когда я проверяю его, все работает нормально, кроме чисел, таких как 11119. Они оказываются 00019. Есть ли что-нибудь Я мог бы подправить?

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Мне кажется, что вы не продумали логику c ясно.

Вот что должно произойти.

Если последнее число равно 0, оно должно быть изменилось на 9, и перенос должен быть сохранен.
Повторяйте до тех пор, пока перенос не требуется поддерживать.

Этот лог c лучше всего реализовать с использованием do - while l oop. Вот то, что я придумал.

int size = v.size();
bool carry = true;
int i = size - 1;
do
{
   if (v.at(i) == 0)
   {
      v.at(i) = 9;
   }
   else
   {
      v.at(i)--;
      carry = false;
   }
   --i;
}
while ( carry == true && i >= 0);

Вот полная программа

#include <iostream>
#include <vector>

void test(std::vector<int> v)
{
   int size = v.size();
   bool carry = true;
   int i = size - 1;
   do
   {
      if (v.at(i) == 0)
      {
         v.at(i) = 9;
      }
      else
      {
         v.at(i)--;
         carry = false;
      }
      --i;
   }
   while ( carry == true && i >= 0);

   for ( auto item : v )
   {
      std::cout << item << " ";
   }
   std::cout << std::endl;
}

int main()
{
   test({1, 1, 1, 1, 9});
   test({5, 0, 0, 0, 0});
}

и ее вывод

1 1 1 1 8
4 9 9 9 9

Смотрите, как она работает на https://ideone.com/lxs1vz.

0 голосов
/ 15 апреля 2020

Вычитание, как вы пытались сделать, может быть сделано так:

#include <iterator>

std::vector<int> v1 = {5, 0, 0, 0};

for (std::vector<int>::reverse_iterator i = v1.rbegin(); i != v1.rend(); i++) {
    *i -= 1;
    if (*i < 0) {
      *i = 9;
    }
    else {
      break;
    }
}
...