添加两个不同大小的独立 int 向量的值?

Mat*_*son 3 c++ math sum vector add

我想知道如何将两个向量的值相加,如下所示:

vector<int> v1 = {3, 1, 7};
vector<int> v2 = {6, 5};
vector<int> v3 = {3, 8, 2}; // The sum of v1 and v2
Run Code Online (Sandbox Code Playgroud)

这里的结果应该是 382,因为 317 + 65 产生 382。

有没有办法做到这一点?向量的大小非常棘手。例如,v1 中的第二个元素是 1,而 v2 中的第二个元素是 5。但是,必须将 5 添加到 7,而不是 1。

编辑:忘了提到向量可以无限长。转换为 int 然后再转换回向量可能会导致数字丢失。

Ani*_*166 5

这是我根据所需条件设计的一种简单方法:(考虑向量v1v2,数据类型DT

  • 大小差异:对于向量大小不等的情况,您可以简单地0在末尾使用std::vector<>::insert(iterator, 0)迭代器将其附加到开头,因为您需要首先使用零以进行正确的元素到元素添加。在此之前,检查两个向量中哪个更大,收集差异并在循环中插入相同的次数:
   int diff;
   if(v1.size() > v2.size())
   {  diff = v1.size() - v2.size();
      for(int i = 0; i < diff; ++i)
          v2.insert(v2.begin(),0);
   }          
   else
   {  diff = v2.size() - v1.size();
      for(int i = 0; i < diff; ++i)
          v1.insert(v1.begin(),0);
   }
Run Code Online (Sandbox Code Playgroud)
  • 此外:现在,向量相等的尺寸,可以使用std::plusfunctional首标用于添加一个矢量(比方说的元件v1)与其它载体(v2)的逐元素,容忍在适当的迭代器的位置std::transform
std::transform(v1.begin( ), v1.end( ), v2.begin( ), v1.begin( ),std::plus<DT>( ));
Run Code Online (Sandbox Code Playgroud)

这将收集的逐元素之v1v2v1(互换)。唯一剩下的问题或条件是溢出,对于元素级加法总和大于或等于 10 的情况。

  • 溢出:对于向量中除第一个元素(0索引处)之外的所有元素,我们需要1在溢出 ( >=10) 的情况下进位/添加到下一个元素,并将当前向量元素分配给除以的余数10. 但是,对于第一个溢出的元素,我们需要为向量的开头分配另一个元素(例如:{3,1} + {9,2} = {1,2,3}),这将是一1试(考虑单个数字矢量元素),我们可以针对其处以单独if的语句:
   for(int i = v1.size(); i > 0; --i) 
   { 
       if(i==1 && v1[1]>=10)
       {   v1[1]=v1[1]%10;
           v1.insert(v1.begin(),1);
       }     
       else if(i!=1 && v1[i-1]>=10)
       {  v1[i-1]=v1[i-1]%10;
          v1[i-2]=v1[i-2]+1;
       }
   }
Run Code Online (Sandbox Code Playgroud)

例子:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#define DT long long int
int main() 
{   
    std::vector<DT> v1 = {5, 2, 5, 7, 8}; 
    std::vector<DT> v2 = {4, 5, 6};  

                         // 52578
                         // 00456
                         // -----
        Expected output: // 53034   

   // Size management:
   int diff;
   if(v1.size() > v2.size())
   {  diff = v1.size() - v2.size();
      for(int i = 0; i < diff; ++i)
          v2.insert(v2.begin(),0);
   }          
   else
   {  diff = v2.size() - v1.size();
      for(int i = 0; i < diff; ++i)
          v1.insert(v1.begin(),0);
   }

   // Element-wise addition:
   std::transform(v1.begin( ), v1.end( ), v2.begin( ), v1.begin( ),std::plus<DT>( ));

   // Overflow management:
   for(int i = v1.size(); i > 0; --i) 
   { 
       if(i==1 && v1[1]>=10)
       {   v1[1]=v1[1]%10;
           v1.insert(v1.begin(),1);
       }     
       else if(i!=1 && v1[i-1]>=10)
       {  v1[i-1]=v1[i-1]%10;
          v1[i-2]=v1[i-2]+1;
       }
   }   

   // Display sum
   for(auto v:v1)
      std::cout<<v;
}
Run Code Online (Sandbox Code Playgroud)

输出:53034

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#define DT long long int
int main() 
{   
    std::vector<DT> v1 = {5, 2, 5, 7}; 
    std::vector<DT> v2 = {9, 3, 7, 2};  

                         //  5257
                         //  9372
                         // -----
        Expected output: // 14629   

   // Size management:
   int diff;
   if(v1.size() > v2.size())
   {  diff = v1.size() - v2.size();
      for(int i = 0; i < diff; ++i)
          v2.insert(v2.begin(),0);
   }          
   else
   {  diff = v2.size() - v1.size();
      for(int i = 0; i < diff; ++i)
          v1.insert(v1.begin(),0);
   }

   // Element-wise addition:
   std::transform(v1.begin( ), v1.end( ), v2.begin( ), v1.begin( ),std::plus<DT>( ));

   // Overflow management:
   for(int i = v1.size(); i > 0; --i) 
   { 
       if(i==1 && v1[1]>=10)
       {   v1[1]=v1[1]%10;
           v1.insert(v1.begin(),1);
       }     
       else if(i!=1 && v1[i-1]>=10)
       {  v1[i-1]=v1[i-1]%10;
          v1[i-2]=v1[i-2]+1;
       }
   }   

   // Display sum
   for(auto v:v1)
      std::cout<<v;
} 
Run Code Online (Sandbox Code Playgroud)

输出: 14629