diff options
Diffstat (limited to 'challenge-003/paulo-custodio/cpp')
| -rw-r--r-- | challenge-003/paulo-custodio/cpp/ch-1.cpp | 52 | ||||
| -rw-r--r-- | challenge-003/paulo-custodio/cpp/ch-2.cpp | 44 |
2 files changed, 96 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; + } +} diff --git a/challenge-003/paulo-custodio/cpp/ch-2.cpp b/challenge-003/paulo-custodio/cpp/ch-2.cpp new file mode 100644 index 0000000000..cf64c51a86 --- /dev/null +++ b/challenge-003/paulo-custodio/cpp/ch-2.cpp @@ -0,0 +1,44 @@ +/* +Challenge 003 + +Challenge #2 +Create a script that generates Pascal Triangle. Accept number of rows from +the command line. The Pascal Triangle should have at least 3 rows. For more +information about Pascal Triangle, check this wikipedia page. + +*/ + +#include <iostream> +#include <string> +#include <vector> + +void draw_pascal(int rows) { + // allocate current and next row + std::vector<int> data[2]; + for (int i = 0; i < 2; i++) + data[i].resize(rows+1); + + int cur = 0; + data[cur][0] = 1; + for (int row = 1; row <= rows; row++) { + // print current row + for (int col = 0; col < rows-row; col++) + std::cout << ' '; + for (int col = 0; col < row; col++) + std::cout << data[cur][col] << ' '; + std::cout << std::endl; + + // compute next row + int nxt = 1-cur; + data[nxt][0] = 1; + data[nxt][row] = 1; + for (int col = 1; col < row; col++) + data[nxt][col] = data[cur][col-1] + data[cur][col]; + cur = nxt; + } +} + +int main(int argc, char* argv[]) { + if (argc == 2) + draw_pascal(atoi(argv[1])); +} |
