#include <iostream>

unsigned long concatenateArr_Sone( unsigned* first, unsigned* last )
{
    unsigned long value = 0,
                  ct = 1;

    while( last-- != first )
    {
        if( *last > 9 )
        {
            value += ct * (*last % 10);
            *last++ /= 10;
        }
        else
            value += ct * *last;

        ct *= 10;
    }

    return value;
}

unsigned long append_number(unsigned long x, unsigned y) {
  return (y < 10 ? x : append_number(x, y / 10)) * 10 + y % 10;
}

#include <numeric>

unsigned long concatenateArr_Seldon( unsigned* first, unsigned* last )
{
    return std::accumulate(first, last, 0ul, append_number);
}

#include <iterator>
#include <random>
#include <algorithm>
#include <iomanip>
#include <chrono>
#include <ctime>

unsigned arr[5];

template<typename Callable>
void check( std::string const& name, Callable&& Foo )
{
    std::cout << '\n' << name << ": " << Foo( std::begin(arr), std::end(arr) ) << ", needed ";

    using namespace std::chrono;
    auto _tp = system_clock::now();
    unsigned long val;

    for( unsigned ct = 0; ct < 10000000; ++ct )
        val = Foo( std::begin(arr), std::end(arr) );

    std::cout << (system_clock::now() - _tp).count() << " ticks, result = " << val;
}

int main()
{
    std::uniform_int_distribution<unsigned> dist(0, 100);
    std::minstd_rand device(time(nullptr));
    std::generate( std::begin(arr), std::end(arr), std::bind(dist, device) );

    std::cout << "Values: ";
    std::copy( std::begin(arr), std::end(arr), std::ostream_iterator<unsigned>(std::cout, ", ") );

    check( "Seldon", concatenateArr_Seldon );
    check( "Sone  ", concatenateArr_Sone );
}