#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>
int main(void)
{
// ull is large data type to input large numbers
unsigned long long inputNumb, sieveMax;
// for holding found numbers; easy way to sort ascending
std::vector<unsigned long long> foundNumbers;
// flag for ending division in prime factorization
bool divided;
std::cout << "Please enter a number to check for and list prime factors\n";
std::cin >> inputNumb;
// Use sieveMax for both ease of reading and to save as lvalue
sieveMax = inputNumb + 1;
// Fill bit vector with 1's, indicating a prime number
std::vector<bool> numberList(sieveMax, true);
for(unsigned long long i = 3; i < sieveMax; i++)
{
if((i & 0x1) && numberList[i] == true)
{
// Iterate through list by multiples of the current sieve seed
for(unsigned long long j = (i*2); j < sieveMax; j += i)
{
// If it is currently considered prime
if((j & 0x1) && numberList[j] == true)
{
// Set it to false due to found factor
numberList[j] = false;
}
}
}
}
// Factor can't be greater than half
sieveMax /= 2;
// If it is odd (due to skipped evens) and set as true
if(((inputNumb == 2) || (inputNumb & 0x1)) && numberList[inputNumb])
{
std::cout << inputNumb << " is prime\n";
}
// If it is not prime...
else
{
std::cout << std::endl << "The prime factors of " << inputNumb << " are:\n";
// While it is still being factored
while(inputNumb != 0)
{
// Set flag for for conditions
divided = false;
// increment through prime sieve
for(unsigned long long i = 2; !divided; i++)
{
// If it is 2, or it is odd, and it is set as prime
// and modulus to 0
if( ((i == 2) || (i & 0x1)) && numberList[i] && ((inputNumb % i) == 0))
{
// Divide to continue factoring
inputNumb = (inputNumb / i);
// Push back found factor for sorting and output
foundNumbers.push_back(i);
// Break loop condition
divided = true;
}
// Sievemax is half the value of input number
else if(i > sieveMax)
{
// Set it to 0 to break while loop, as no more
// prime factors exist
inputNumb = 0;
divided = true;
}
}
}
}
// Sort the found factors ascending
std::sort(foundNumbers.begin(), foundNumbers.end());
// Iterate through the found numbers, and output
for(auto it : foundNumbers)
{
std::cout << it << "\n";
}
return 0;
}
