fork download
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. int num(char c) // цифра в некоторой системе счисления
  8. {
  9. const char digs[] = "0123456789abcdefghijklmnopqrstuvwxyz";
  10. return int(strchr(digs, tolower(c)) - digs);
  11. }
  12.  
  13. // Строка с числом в системе счисления base в double
  14. // Защиты от дурака нет!
  15. double toNum(const char* s, int base)
  16. {
  17. if (base < 2 || base > 36) throw range_error("Wrong base");
  18. const char* c;
  19. double r = 0;
  20. for (c = s; *c && *c != '.'; ++c)
  21. r = r * base + num(*c);
  22. if (*c == '.')
  23. {
  24. for (double bs = base; *++c && bs > 0; bs *= base)
  25. r += num(*c) / bs;
  26. }
  27. return r;
  28. }
  29.  
  30. // Число double в строку в системе счисления base, с prec знаков после точки
  31. // Защиты от дурака нет!
  32. string fromNum(double x, int base, int prec = 6)
  33. {
  34. const char digs[] = "0123456789abcdefghijklmnopqrstuvwxyz";
  35. if (base < 2 || base > 36) throw range_error("Wrong base");
  36. int d = floor(x);
  37. string r;
  38. if (d == 0) r = "0";
  39. else
  40. {
  41. while (d)
  42. {
  43. r += digs[d % base];
  44. d /= base;
  45. }
  46. reverse(r.begin(), r.end());
  47. }
  48. x = x - floor(x);
  49. if (x && prec > 0)
  50. {
  51. r += '.';
  52. for (int i = 0; i < prec; ++i)
  53. {
  54. x *= base;
  55. r += digs[int(x)];
  56. x = x - floor(x);
  57. }
  58. }
  59. return r;
  60. }
  61.  
  62.  
  63. // Простенький тест...
  64. int main(int argc, char* argv[])
  65. {
  66. string seven = "1234.56";
  67. cout << "orig: " << seven << endl;
  68. double x = toNum(seven.c_str(), 7);
  69. cout << "x = " << x << endl;
  70. string elev = fromNum(x, 11, 20);
  71. cout << "11: " << elev << endl;
  72.  
  73.  
  74. x = toNum(elev.c_str(), 11);
  75. cout << "x = " << x << endl;
  76. elev = fromNum(x, 4, 20);
  77. cout << "4: " << elev << endl;
  78.  
  79.  
  80. x = toNum(elev.c_str(), 4);
  81. cout << "x = " << x << endl;
  82. elev = fromNum(x, 7, 20);
  83. cout << "7: " << elev << endl;
  84. }
  85.  
Success #stdin #stdout 0s 4980KB
stdin
Standard input is empty
stdout
orig: 1234.56
x = 466.837
11: 394.92276a6074542268188a
x = 466.837
4: 13102.31120310033223012201
x = 466.837
7: 1234.55666666666666260026