質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

6回答

12030閲覧

数字とアルファベットの組み合わせで数列を作りたい

sinatose

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2017/01/26 01:48

編集2017/01/26 02:20

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
Zuishin

総合スコア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
tamoto

総合スコア4105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tamoto

2017/01/26 04:15 編集

同じくルールを見落としていました……最初の2桁は十進だったんですね……ちょっと考え直してきます。 -> 考え直してきました。
guest

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
tacsheaven

総合スコア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
Y.H.

総合スコア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
107User

総合スコア78

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C# 36進数変換、で検索すると参考になる資料が出て来るかと思います。36進法とは0〜9とA〜Zをフルに使った記法です。

投稿2017/01/26 02:01

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaya_ohashi

2017/01/26 02:02

すみません、一番上の条件を見落としていました…36進が使えるのは3桁目以降だけなんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問