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

Posted

技术标签:

【中文标题】从数字中减一表示为向量?【英文标题】:Decremeting one from a number represent as a vector? 【发布时间】:2020-04-15 06:02:20 【问题描述】:

我正在尝试将一个可以无限长并以向量表示的数字减 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。有什么我可以调整的吗?

【问题讨论】:

算法错误,不需要调整,需要重写。想一想你将如何手工完成,假装你又回到了八岁,并且第一次学习如何做到这一点。然后无论你使用什么方法,编码。 了解如何在调试器中单步调试您的代码。说真的,这是一种可以让您自己解决此类问题的技能。 【参考方案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查看它。

【讨论】:

非常感谢!我在算法方面遇到了问题......另外,我正在考虑使用一段时间而不是 do-while,但这更有意义。 @MattThompson,不客气。很高兴我能提供帮助。【参考方案2】:

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

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

【讨论】:

以上是关于从数字中减一表示为向量?的主要内容,如果未能解决你的问题,请参考以下文章

【R】数值型向量及运算

如何将表示二进制的 int 向量转换为表示十进制数的 int 向量? C++

如何将包含矩阵的文件读取为向量的向量?

three.js 数学方法之Vector3

字向量和词向量区别

代数小课堂:向量代数(方向比努力更重要)