Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从表示为向量的数字中减去一?_C++_Algorithm_Math_Operator Overloading_Subtraction - Fatal编程技术网

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

C++ 从表示为向量的数字中减去一?,c++,algorithm,math,operator-overloading,subtraction,C++,Algorithm,Math,Operator Overloading,Subtraction,我试图将一个可以无限长的数字,用向量表示,递减1。举个小例子: vector<int> v1 = {5, 0, 0, 0}; 当我测试它时,除了像11119这样的数字之外,一切都正常。结果是00019。有什么我可以调整的吗?在我看来,你没有把逻辑想清楚 以下是需要发生的事情 如果最后一个数字是0,则需要将其更改为9,并且必须保持进位。 重复此步骤,直到不需要维护进货 该逻辑最好使用do-while循环来实现。这是我想到的 int size = v.size(); bool carr

我试图将一个可以无限长的数字,用向量表示,递减1。举个小例子:

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

当我测试它时,除了像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});
}

查看它的工作状态。

当您尝试执行减法时,可以这样执行:

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

算法是错误的,它不需要调整,它需要重写。想想你将如何用手来做这件事,假装你又八岁了,并且第一次学习如何做这件事。然后,无论您使用什么方法,都要编写相应的代码。学习如何在调试器中单步执行代码。说真的,这是一项让你自己解决类似问题的技能。非常感谢!我的算法有问题。。。还有,我想用一段时间来代替一段时间,但这更有意义。@MattThompson,不客气。很高兴我能帮忙。
#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});
}
#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;
    }
}