fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <cstdint>
  5. #include <algorithm>
  6.  
  7. typedef std::vector<std::uint64_t> DType;
  8. static const std::uint64_t Radix = 'Z' - 'A';
  9.  
  10. DType DecToRadix(std::uint64_t N, std::uint64_t R){
  11. DType D;
  12.  
  13. std::uint64_t V = 0;
  14. bool Carry = false;
  15. std::uint64_t T = 0;
  16.  
  17. if (N == 0)return{ 0, };
  18. while (N != 0){
  19. V = (N % R) +(N>=R? 1:0);
  20. D.push_back(V);
  21. Carry = false;
  22. T = N - R;
  23. if (T >=0 && T<=R) Carry = true;
  24. N = (N - V) / R;
  25. }
  26.  
  27. if (Carry) D.push_back(0);
  28.  
  29. for (std::size_t i = 0; i < D.size()-1; i++){
  30. D[i] = (R + D[i]-1) % R;
  31. }
  32. std::reverse(D.begin(), D.end());
  33.  
  34.  
  35. return D;
  36. }
  37. std::int64_t RadixToDec(DType D, std::uint64_t R){
  38. std::uint64_t N = 0;
  39.  
  40. if (D.size() == 0) return 0;
  41.  
  42. for (std::size_t i = 0; i < D.size(); i++)
  43. {
  44. N *= R;
  45. N += D[i]+1;
  46. }
  47.  
  48. return N-1;
  49. }
  50.  
  51. std::string DTypeToString(DType D){
  52. std::string S;
  53.  
  54. if (D.size() == 0) return{ "error" };
  55. for (std::size_t i = 0; i < D.size(); i++)
  56. {
  57. S += 'A' + static_cast<char>(D[i]);
  58. }
  59.  
  60. return S;
  61. }
  62. DType StringToDType(std::string s){
  63. DType D;
  64.  
  65. for (std::size_t i = 0; i < s.size(); i++){
  66. D.push_back(s[i] - 'A');
  67. }
  68. return D;
  69. }
  70.  
  71.  
  72. std::string Enc(std::uint64_t N){
  73. DType D;
  74. std::string S;
  75.  
  76. D = DecToRadix(N, Radix+1);
  77. S = DTypeToString(D);
  78.  
  79. return S;
  80. }
  81.  
  82. std::uint64_t Dec(std::string s){
  83. DType D;
  84.  
  85. D = StringToDType(s);
  86.  
  87. return RadixToDec(D, Radix+1);
  88. }
  89.  
  90. int main(){
  91. std::string S;
  92. std::uint64_t N=0;
  93. N = 1;
  94. S = Enc(N-1);
  95. std::cout << N << " -> " << S << std::endl;
  96. N = 27;
  97. S = Enc(N-1);
  98. std::cout << N << " -> " << S << std::endl;
  99. N = 28;
  100. S = Enc(N-1);
  101. std::cout << N << " -> " << S << std::endl;
  102. N = 703;
  103. S = Enc(N-1);
  104. std::cout << N << " -> " << S << std::endl;
  105. N = 2;
  106. S = Enc(N-1);
  107. std::cout << N << " -> " << S << std::endl;
  108. N = 125;
  109. S = Enc(N-1);
  110. std::cout << N << " -> " << S << std::endl;
  111. N = 2757;
  112. S = Enc(N-1);
  113. std::cout << N << " -> " << S << std::endl;
  114. N = 702;
  115. S = Enc(N-1);
  116. std::cout << N << " -> " << S << std::endl;
  117. N = 18278;
  118. S = Enc(N-1);
  119. std::cout << N << " -> " << S << std::endl;
  120.  
  121.  
  122. S = "A";
  123. N = Dec(S);
  124. std::cout << S << " -> " << N+1 << std::endl;
  125. S = "AA";
  126. N = Dec(S);
  127. std::cout << S << " -> " << N+1 << std::endl;
  128. S = "AAA";
  129. N = Dec(S);
  130. std::cout << S << " -> " << N+1 << std::endl;
  131. S = "Z";
  132. N = Dec(S);
  133. std::cout << S << " -> " << N+1 << std::endl;
  134. S = "ZZ";
  135. N = Dec(S);
  136. std::cout << S << " -> " << N+1 << std::endl;
  137. S = "ZZZ";
  138. N = Dec(S);
  139. std::cout << S << " -> " << N+1 << std::endl;
  140. S = "DBA";
  141. N = Dec(S);
  142. std::cout << S << " -> " << N+1 << std::endl;
  143.  
  144. for (std::uint64_t i = 1; i < 2500000; i++){
  145. S = Enc(i - 1);
  146. N = Dec(S) + 1;
  147. if (N != i) std::cout << "Test Missed:" << i << "!=" << N << " ->" << S << std::endl;
  148. }
  149.  
  150. return 0;
  151.  
  152.  
  153. }
Success #stdin #stdout 4.71s 3236KB
stdin
Standard input is empty
stdout
1 -> A
27 -> AA
28 -> AB
703 -> AAA
2 -> B
125 -> DU
2757 -> DBA
702 -> ZZ
18278 -> ZZZ
A -> 1
AA -> 27
AAA -> 703
Z -> 26
ZZ -> 702
ZZZ -> 18278
DBA -> 2757