aboutsummaryrefslogtreecommitdiff
path: root/challenge-003/paulo-custodio/cpp/ch-1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-003/paulo-custodio/cpp/ch-1.cpp')
-rw-r--r--challenge-003/paulo-custodio/cpp/ch-1.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/challenge-003/paulo-custodio/cpp/ch-1.cpp b/challenge-003/paulo-custodio/cpp/ch-1.cpp
new file mode 100644
index 0000000000..d9ca7ee9f0
--- /dev/null
+++ b/challenge-003/paulo-custodio/cpp/ch-1.cpp
@@ -0,0 +1,52 @@
+/*
+Challenge 003
+
+Challenge #1
+Create a script to generate 5-smooth numbers, whose prime divisors are less
+or equal to 5. They are also called Hamming/Regular/Ugly numbers. For more
+information, please check this wikipedia.
+
+*/
+
+#include <iostream>
+#include <deque>
+#include <string>
+#include <algorithm>
+
+int min3(int a, int b, int c) {
+ return std::min(a, std::min(b, c));
+}
+
+// hamming number generator
+std::deque<int> q2, q3, q5;
+
+int next_hamming() {
+ // init three queues with 1
+ if (q2.empty()) {
+ q2.push_back(1);
+ q3.push_back(1);
+ q5.push_back(1);
+ }
+
+ // get the smallest of the queue heads
+ int n = min3(q2.front(), q3.front(), q5.front());
+
+ // shift used multiples
+ if (n == q2.front()) q2.pop_front();
+ if (n == q3.front()) q3.pop_front();
+ if (n == q5.front()) q5.pop_front();
+
+ // push next multiples
+ q2.push_back(2*n);
+ q3.push_back(3*n);
+ q5.push_back(5*n);
+
+ return n;
+}
+
+int main(int argc, char* argv[]) {
+ if (argc == 2) {
+ for (int i = 0; i < atoi(argv[1]); i++)
+ std::cout << next_hamming() << std::endl;
+ }
+}