This is from an older question of mine that I decided to revisit:
Simplifying and optimizing factors and prime factorization generator
In that question, someone suggested I use an std::map
to hold the factors generated from my inputted number. I've also decided to use it with my generated prime factorization, which also works. Based on what I've found online, auto
is one way of iterating through an std::map
. I've decided to use that since it appears that my compiler supports C++11.
Am I using std::map
appropriately here, or am I developing some bad habits? I want to develop good habits since I'm interested in using it more in the future.
#include <iostream>
#include <cstdint>
#include <map>
#include <cmath>
void displayFactors(const std::map<uint64_t, uint64_t> &factors);
void displayPrimeFactorization(const std::map<uint64_t, uint64_t> &primeFactorization);
void findFactors(uint64_t, std::map<uint64_t, uint64_t> &factors);
void findPrimeFactorization(uint64_t positiveInt, std::map<uint64_t, uint64_t> &primeFactorization);
int main()
{
std::map<uint64_t, uint64_t> factors;
std::map<uint64_t, uint64_t> primeFactorization;
uint64_t positiveInt;
std::cout << "\n\n> Positive Int: ";
std::cin >> positiveInt;
findFactors(positiveInt, factors);
std::cout << "\n\n * Factors:\n\n";
displayFactors(factors);
findPrimeFactorization(positiveInt, primeFactorization);
std::cout << "\n * Prime Factorization:\n\n ";
displayPrimeFactorization(primeFactorization);
std::cout << std::endl << std::endl;
std::cin.ignore();
std::cin.get();
}
void displayFactors(const std::map<uint64_t, uint64_t> &factors)
{
for (auto iter = factors.begin(); iter != factors.end(); ++iter)
{
std::cout << " " << iter->first << " x " << iter->second << "\n";
}
}
void displayPrimeFactorization(const std::map<uint64_t, uint64_t> &primeFactorization)
{
for (auto iter = primeFactorization.begin(); iter != primeFactorization.end(); ++iter)
{
if (iter != primeFactorization.begin()) std::cout << " x ";
std::cout << iter->first;
if (iter->second > 1) std::cout << '^' << iter->second;
}
}
void findFactors(uint64_t positiveInt, std::map<uint64_t, uint64_t> &factors)
{
uint64_t sqrtInt = static_cast<uint64_t>(sqrt(static_cast<double long>(positiveInt)));
for (uint64_t iter = 1; iter <= sqrtInt; ++iter)
{
if (positiveInt % iter == 0)
{
uint64_t quotient = positiveInt / iter;
factors[iter] = quotient;
}
}
}
void findPrimeFactorization(uint64_t positiveInt, std::map<uint64_t, uint64_t> &primeFactorization)
{
uint64_t divisor = 2;
uint64_t power = 0;
while (positiveInt != 1)
{
while (positiveInt % divisor == 0)
{
positiveInt /= divisor;
power++;
}
if (power > 0)
primeFactorization[divisor] = power;
power = 0;
divisor++;
}
}
auto
(my compiler doesn't seem to support range-based loops). \$\endgroup\$ – Jamal♦ May 28 '13 at 15:12