fork download
  1. #include <cmath>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. struct div_with_positive_remainder_t
  6. {
  7. int quot;
  8. int rem;
  9. };
  10.  
  11. div_with_positive_remainder_t div_with_positive_remainder(int x, int y)
  12. {
  13. if (y == 0) {
  14. throw std::runtime_error("division by zero");
  15. }
  16. int r = x % y;
  17. if (r < 0) {
  18. r += std::abs(y);
  19. }
  20. int q = (x - r) / y;
  21. return {q, r};
  22. }
  23.  
  24. std::vector<int> to_negbase(int n, int negbase = -2)
  25. {
  26. std::vector<int> res;
  27.  
  28. while (n != 0) {
  29. auto div = div_with_positive_remainder(n, negbase);
  30. res.push_back(div.rem);
  31. n = div.quot;
  32. }
  33. return res;
  34. }
  35.  
  36. int to_int(const std::vector<int> &digits, int base = -2) {
  37. int res = 0;
  38. int power = 1;
  39. for (auto digit : digits){
  40. res += power * digit;
  41. power *= base;
  42. }
  43. return res;
  44. }
  45.  
  46. std::vector<int> negative_base(const std::vector<int> &v)
  47. {
  48. return to_negbase(-to_int(v));
  49. }
  50.  
  51. void print(const std::vector<int>& v, int negbase = -2)
  52. {
  53. std::cout << to_int(v, negbase) << " = [";
  54. for (auto e: v) {
  55. std::cout << e << " ";
  56. }
  57. std::cout << "](" << negbase << ")" << std::endl;
  58. }
  59.  
  60.  
  61. int main()
  62. {
  63. print(to_negbase(2369, -10), -10); // 18449(-10)
  64. print(to_negbase(1234, -8), -8); // 16462(-10)
  65. print(to_negbase(23));
  66.  
  67. print(negative_base({1, 1, 0, 1, 0, 1, 1}));
  68. }
  69.  
Success #stdin #stdout 0s 3416KB
stdin
Standard input is empty
stdout
2369 = [9 4 4 8 1 ](-10)
1234 = [2 6 4 6 1 ](-8)
23 = [1 1 0 1 0 1 1 ](-2)
-23 = [1 0 0 1 1 1 ](-2)