从表示为向量的数字中减一?

Decremeting one from a number represent as a vector?

我正在尝试将一个可以无限长并用向量表示的数字减 1。举一个小例子:

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

末尾减一后的结果应该是:

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。有什么我可以调整的吗?

我觉得你没有把逻辑想清楚。

这是需要发生的事情。

如果最后一个数是0,需要改成9,并且要保留一个进位。
重复直到不需要保持进位。

该逻辑最好使用 do - while 循环来实现。这是我想出的。

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 的工作情况。

您尝试做的减法可以这样完成:

#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;
    }
}