Вот простой подход, который я разработал для требуемых условий: (с учетом векторов v1
и v2
, типа данных DT
)
- Разница в размере: В случаях, когда векторы имеют неравные размеры, вы можете просто добавить
0
в конце, используя std::vector<>::insert(iterator, 0)
с итератором в начале, так как для правильного сложения элемента к элементу вам понадобятся нули в начале. Перед этим проверьте, какой из двух векторов больше по размеру, соберите разницу и вставьте для того же количества раз в al oop:
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);
}
- Добавление : Теперь, когда векторы имеют одинаковые размеры, вы можете использовать
std::plus
из заголовка functional
для добавления элементов одного вектора (скажем, v1
) к другому вектору (v2
) поэлементно, мириться с правильными позициями итератора в std::transform
:
std::transform(v1.begin( ), v1.end( ), v2.begin( ), v1.begin( ),std::plus<DT>( ));
Это соберет поэлементную сумму v1
и v2
в v1
(взаимозаменяемо). Единственная оставшаяся проблема или условие для решения - переполнение, для случаев, когда сумма добавлений по элементам должна быть больше или равна 10.
- Переполнение: Для всех элементов в векторе, отличном от первого (с индексом 0 th ), нам потребуется перенести / добавить
1
к следующему элементу в случае переполнения (>=10
) и назначить текущий элемент вектора к остатку при делении на 10. Однако для переполнения первого элемента нам нужно назначить другой элемент в начале вектора (например: {3,1} + {9,2} = {1,2,3 }), который снова будет 1
(учитывая отдельные элементы вектора di git), для которого мы можем наложить отдельные 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;
}
}
Примеры:
#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;
}
Выход: 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;
}
Выход: 14629