/****************************************************************************** * This program computes Renard (Preferred) Numbers * * Copyright © 2017 Richard Lesh. All rights reserved. *****************************************************************************/ #undef NDEBUG #include "Utils.hpp" #include #include #include #include #include #include std::locale utf8loc(std::locale(), new std::codecvt_utf8); using namespace std; double round_sig_dig(double value, int sigdigits) noexcept { int const p = sigdigits - int(floor(log10(value))) - 1; return floor(value * pow(10., p) + 0.5) / pow(10., p); } int main(int argc, char **argv) { setlocale(LC_ALL, "en_US.UTF-8"); wcout.imbue(utf8loc); wcin.imbue(utf8loc); if (argc != 3) { wcout << L"Syntax: " << Utils::UTF8_to_wstring(argv[0]) << L" 5|10|20|40 precision" << endl; exit(1); } int series = Utils::stoiWithDefault(Utils::UTF8_to_wstring(argv[1]), 5); int precision = Utils::stoiWithDefault(Utils::UTF8_to_wstring(argv[2]), 2); if (series < 5) { series = 5; } if (series > 40) { series = 40; } if (precision < 0) { precision = 0; } if (precision > 4) { precision = 4; } vector renard_numbers = {}; double factor = pow(10.0, 1.0 / series); double renard_number = 1.0; Utils::push(renard_numbers, renard_number); for (auto i = 1; i < series; ++i) { renard_number *= factor; Utils::push(renard_numbers, round_sig_dig(renard_number, precision)); } wcout << L"R" << series << L": " << endl; bool first = true; for (int range_start = 1; range_start <= 100; range_start *= 10) { for (int i = 0; i < series; ++i) { if ((!first)) { wcout << L", "; } wcout << Utils::sprintf(L"%g", renard_numbers[i] * range_start); first = false; } } wcout << L", 1000" << endl; return 0; }