Here I just added the hailstone really quickly.. Here goes:
C++ Code:
#include <iostream>
#include <array>
#include <stdexcept>
#include <vector>
template<typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type>
T MaxN(T* theArray, int Size)
{
T MaxVal = 0;
for(int I = 0; I < Size; ++I)
{
for (int J = 0; J < Size; ++J)
{
if (I != J)
{
if (theArray[I] + theArray[J] > MaxVal)
MaxVal = theArray[I] + theArray[J];
}
}
}
return MaxVal;
}
template<std::size_t N>
bool FindTriple(std::array<int, N> ArrayA, std::array<int, N> ArrayB, std::array<int, N> ArrayC)
{
for (std::size_t I = 0; I < N; ++I)
{
for (std::size_t J = 0; J < N; ++J)
{
for (std::size_t K = 0; K < N; ++K)
{
if (ArrayA[I] + ArrayB[J] + ArrayC[K] == 0)
{
return true;
}
}
}
}
return false;
}
void Sort(int* theArray, int Size)
{
auto FindMinIndex = [&](int Start){
int Index = Start;
int Minimum = theArray[Start];
for (int I = Start; I < Size; ++I)
{
if (theArray[I] < Minimum)
{
Minimum = theArray[I];
Index = I;
}
}
return Index;
};
for (int I = 0; I < Size; ++I)
{
int MinIndex = FindMinIndex(I);
int T = theArray[I];
theArray[I] = theArray[MinIndex];
theArray[MinIndex] = T;
}
}
std::vector<int> HailStone(int PickedNumber)
{
if (PickedNumber <= 0)
throw std::invalid_argument("Value Entered Must be greater than 0.");
int Count = 0;
std::vector<int> Result(1, PickedNumber);
auto IsOdd = [&](int Value) {return Value & 1;};
int Orig = (PickedNumber % 4) == 0 ? PickedNumber - 1 : PickedNumber + 1;
while(true)
{
if (IsOdd(PickedNumber))
{
PickedNumber *= 3;
PickedNumber += 1;
Result.push_back(PickedNumber);
}
else
{
PickedNumber /= 2;
Result.push_back(PickedNumber);
}
if (Count > 0)
{
++Count;
}
if (Count >= Orig)
break;
if (Result.back() == 4)
{
++Count;
continue;
}
}
return std::move(Result);
}
int main()
{
auto Result = HailStone(4);
for (auto it = Result.begin(); it != Result.end(); ++it)
std::cout<<*it<<" ";
}