2桁までは数字のみで連番
01,02,03,04,05...97,98,99
3桁からは数字(1-9)とアルファベット(A-Z)の組み合わせ
1A,1B,1C,1D...1X,1Y,1Z
2A,2B,2C,2D...2X,2Y,2Z
↓
9A,9B,9C,9D...9X,9Y,9Z
↓
A1,A2,A3.....A8,A9,AA,AB,AC,AD,AE...AZ
B1,B2,B3.....B8,B9,BA,BB,BC,BD,BE...BZ
↓
Z1,Z2,Z3.....Z8,Z9,ZA,ZB,ZC,ZD,ZE...ZZ
こういう規則性で数列を作りたいのです…
//説明不足点
すみません、説明不足がありましたので追加します。
3桁目からはアルファベットと数字を入れた数列にしたいです。
また、数字の0は使わないようにしたいです。
数字の配列を作成し、ループさせて更にその中にアルファベットの配列をループで回す。9Zになったら、ループを抜けてアルファベット配列ループ内でアルファベット配列のループを回すのがいいのでしょうか? もっといい方法を教えて下さい。よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ロジックが 3 つ必要ですね。
99 までのもの、9A~9Z、A1~ZZ
そのまま実装した泥臭いものが次です。
C#
1static string convert(int src) 2{ 3 if (src < 1) return ""; 4 string alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 5 string digitsAndAlphabets = "123456789" + alphabets; 6 int alphabetsLength = 26; 7 int digitsAndAlphabetsLength = 9 + alphabetsLength; 8 if (src < 100) return string.Format("{0:00}", src); 9 src -= 100; 10 if (src < 9 * alphabetsLength) return string.Format("{0}{1}", (int)(src / alphabetsLength) + 1, alphabets[src % alphabetsLength]); 11 src -= 9 * alphabetsLength; 12 if (src < alphabetsLength * digitsAndAlphabetsLength) return string.Format("{0}{1}", alphabets[src / digitsAndAlphabetsLength], digitsAndAlphabets[src % digitsAndAlphabetsLength]); 13 return ""; 14}
上記洗練の余地があります。
また、高速化が必要であればあらかじめ計算済みのものを作っておくという手もあります。
C#
1static string convert2(int src) 2{ 3 #region data 4 var data = new string[] 5 { 6 "01", 7 "02", 8 "03", 9中略 10 "99", 11 "1A", 12 "1B", 13 "1C", 14中略 15 "ZX", 16 "ZY", 17 "ZZ", 18 }; 19 #endregion 20 if (src < 0 || src >= data.Length) return ""; 21 return data[src]; 22}
投稿2017/01/26 03:26
編集2017/01/26 03:30総合スコア28660
0
(01/26 全面書き換え)
やや無理やりな感じもありますが……
"00"から始まり、"99"までは2桁で出力、3桁目以降は順次追加し、[1-Z]の範囲の列とする、先頭は1始まりとする、という解釈で作成してみました。
csharp
1public IEnumerable<string> Sequence() 2{ 3 var digit = Enumerable.Range(0, 100).Select(x => $"{x, 0:00}"); 4 5 foreach (var result in digit) 6 yield return result; 7 8 foreach (var result in DigitAlpha().SelectMany(_ => digit, (x, y) => x + y)) 9 yield return result; 10} 11 12private IEnumerable<string> DigitAlpha() 13{ 14 var array = Enumerable.Range('1', 9).Concat(Enumerable.Range('A', 26)) 15 .Select(x => ((char)x).ToString()); 16 17 foreach (var result in array) 18 yield return result; 19 20 foreach (var result in DigitAlpha().SelectMany(_ => array, (x, y) => x + y)) 21 yield return result; 22}
そのままだと無限に列挙するので適当にTakeで切ってください。
投稿2017/01/26 02:05
編集2017/01/26 04:18総合スコア4105
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
10進法で考えたときに0~99 までは10進法表記で、
100以降では[1-9][A-Z] となるパターンと、[A-Z][1-9A-Z] となるパターン
ということですよね?
どのパターンに該当するかさえ切り分ければ、それぞれ毎に変換はできますね。
本来の数が100未満 = 素直に10進変換
100以上333(9Zに該当)以下 = (本来の数-100) を、26で割った商=上位桁、余り=下位桁として、それぞれ0-8,0-25 を 1-9, A-Z にみなして表記
334以上 = (本来の数-334)を、35(1-9A-Zで35文字)で割った商=上位桁、余り=下位桁として、それぞれを上と同様にA-Z,1-9A-Zとみなして表記
になりますかね。
上を踏まえて、変換関数はこうなります。
C#
1private string ConvertFunc(int value) { 2 string disp = ""; 3 if (value<100) { 4 disp = string.Format("{0:00}", i); 5 } else if (value<334) { 6 int hidigt = (i - 100) / 26; 7 int lwdigt = (i - 100) % 26; 8 disp = "123456789".Substring(hidigt, 1) + "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Substring(lwdigt, 1); 9 } else { 10 int hidigt = (i - 334) / 35; 11 int lwdigt = (i - 334) % 35; 12 disp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Substring(hidigt, 1) + "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".Substring(lwdigt, 1); 13 } 14 return disp; 15}
投稿2017/01/26 03:18
編集2017/01/26 03:28総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
だめだ、このルールがあると基数変換(36進数)使用しての変換はできないですね。
1A,1B,1C,1D...1X,1Y,1Z
2A,2B,2C,2D...2X,2Y,2Z
↓
9A,9B,9C,9D...9X,9Y,9Z
3桁からは数字(1-9)とアルファベット(A-Z)の組み合わせ
1~99まではそのまま1~99なので36進数としては扱えないですね。
こんな感じですか。 ※ Convert10To36() は割愛
C#
1string ConvertXX(int val) { 2 3 if (val < 100の場合) { 4 return val.ToString(); 5 } 6 return Convert10To36(val - 100 + 46); 7} 8 9System.Text.StringBuilder sb = new System.Text.StringBuilder(); 10sb.Append("0,"); 11for (int i = 1; i < 1349 /* "zz" */ ; i++) { 12 sb.Append(ConvertXX(i)); 13 sb.Append(","); 14} 15Console.WriteLine(sb.ToString());
投稿2017/01/26 02:07
編集2017/01/26 03:39総合スコア7914
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
これでどうでしょうか?
高速化の為にStringBuilderを利用しています。
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 1000; i++)
{
sb.Append(AZnumber(i)+",");
}sb.ToString();//これが答え
private string AZnumber(int i)
{
StringBuilder sb = new StringBuilder();
//100以下
if (i < 100)
{
return i.ToString();
}int d = ( (i -100) / 26); int m = ( (i - 100) % 26);
//(1-9)A-Z
if (d < 9)
{
sb.Append((d+1).ToString());
//sb.Append(((byte)'A' + d).ToString());sb.Append(((char)((byte)'A' + m )).ToString()); }
//(A-Z)(0-Z)
else
{
int dd = ((i - 334) / 33);
sb.Append(((char)((byte)'A' + dd)).ToString());
int mm = ((i - 334) % 33);
if (mm < 10)
{
sb.Append(mm.ToString());
}
else
{
sb.Append(((char)((byte)'A' + (mm - 10))).ToString());
}} return sb.ToString(); }
投稿2017/01/26 04:56
編集2017/01/26 05:04総合スコア78
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C# 36進数変換、で検索すると参考になる資料が出て来るかと思います。36進法とは0〜9とA〜Zをフルに使った記法です。
投稿2017/01/26 02:01
総合スコア9206
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。