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 然后再转换回向量可能会导致数字丢失。
这是我根据所需条件设计的一种简单方法:(考虑向量v1和v2,数据类型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::plus从functional首标用于添加一个矢量(比方说的元件v1)与其它载体(v2)的逐元素,容忍在适当的迭代器的位置std::transform:std::transform(v1.begin( ), v1.end( ), v2.begin( ), v1.begin( ),std::plus<DT>( ));
Run Code Online (Sandbox Code Playgroud)
这将收集的逐元素之v1和v2成v1(互换)。唯一剩下的问题或条件是溢出,对于元素级加法总和大于或等于 10 的情况。
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
| 归档时间: |
|
| 查看次数: |
306 次 |
| 最近记录: |