从数字中减去一个代表矢量吗?

问题描述 投票:0回答:2

我试图将可以无限长并且在矢量中表示的数字减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。我有什么可以调整的地方吗?

c++ algorithm math operator-overloading subtraction
2个回答
1
投票
这是需要发生的事情。

如果最后一个数字为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


0
投票
#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; } }
© www.soinside.com 2019 - 2024. All rights reserved.