teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

a

2020/01/08 15:48

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -1,3 +1,52 @@
1
- [36進数までのサンプル](https://www.atmarkit.co.jp/fdotnet/dotnettips/965radixconvert/radixconvert.html)を参考に頑張ってください。
1
+ こううことですかね
2
2
 
3
+ ```csharp
4
+ using System;
5
+ using System.Collections.Generic;
6
+ using System.Linq;
7
+
8
+
9
+ class Program
10
+ {
11
+ public static void Main()
12
+ {
13
+ Console.WriteLine((new ConvertHelper()).ToString(192));
14
+ Console.WriteLine((new ConvertHelper()).ToLong("25"));
15
+ }
16
+ }
17
+ internal class ConvertHelper
18
+ {
19
+ private readonly string Chars;
20
+ private readonly int Stem;
21
+ public ConvertHelper(int stem, string chars)
22
+ {
23
+ if(stem < 1) throw new ArgumentOutOfRangeException();
24
+ if (chars.Length != (new HashSet<char>(chars)).Count) throw new ArgumentOutOfRangeException();
25
+ Chars = chars;
26
+ Stem = stem;
27
+ }
28
+
29
+ public ConvertHelper(int stem, IEnumerable<char> chars) : this(stem, string.Join(string.Empty, chars))
30
+ {
31
+ }
32
+ public ConvertHelper() : this(95, @"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!""#$%&'()*+,-./:;<=>?@[]^_`{|}~ ") { }
33
+
34
+
35
+ public string ToString(long number) => string.Join(string.Empty, NextDigit(number).Reverse());
36
+ public string ToString(int number) => ToString((long)number);
37
+ private IEnumerable<char> NextDigit(long number)
38
+ {
39
+ while (number > 0)
40
+ {
41
+ yield return Chars[(int)(number % Stem)];
42
+ number /= Stem;
43
+ }
44
+ }
3
- ただの興味なんですけど、37番目以後はどういう文字をつかうのですか?
45
+ public long ToLong(string express)
46
+ {
47
+ return (long)express.Reverse().Select((c,i) => (long)Chars.IndexOf(c) * Math.Pow(Stem, i)).Sum();
48
+ }
49
+ }
50
+ ```
51
+
52
+ [36進数までのサンプル](https://www.atmarkit.co.jp/fdotnet/dotnettips/965radixconvert/radixconvert.html)を参考に頑張ってください。