5


1

私はインデックスが渡されたときに私にアルファベットの位置を与える関数を作成しようとしています。 Excelが列を表示する方法と同じです。 A …​ Z、AA、AB …​. Zまでの結果を得るために以下の関数を書きました。 それはように見えます

静的文字列GetColumnName(int index){const int alphabetsCount = 26; if(index <= alphabetsCount){int code =(index  -  1)(int) 'A'; char.ConvertFromUtf32(code)を返します。文字列を返します。 }

これは 'Z’までうまく働きます。 1を渡した場合は 'A’を返し、2を渡した場合は 'B’を返します。 しかし、この関数に27を渡したときにAAがどのように取得されるのかを理解することはできません。 それを見つけるには再帰的な方法が必要だと思います。

この問題へのどんな入力も素晴らしいでしょう!

編集

これはTordekによって示唆されています。 しかし彼のコードは52、78などのように失敗するでしょう。 これに対する回避策を追加しました。これが最終的な作業コードです。

静的文字列GetColumnName(int index){const int alphabetsCount = 26;

if(index> alphabetsCount){int mod = index%alphabetsCount; int columnIndex = index / alphabetsCount;

// modが0(明らかに割り切れる)の場合、1つの組み合わせの終わりに達しました。 AZ(mod == 0){// index / alphabetsCountのように列インデックスを減らすと、次の値が返され、1列が失われることになります。 columnIndex  -  = 1; //この関数に0を渡すと無効な文字 '@'が返されます。// modはアルファベットの数になります。 だからそれはアルファベットの最後の文字を取ります。 mod = alphabetsCount; GetColumnName(columnIndex)GetColumnName(mod);} } else {int code =(index  -  1)(int) 'A'; char.ConvertFromUtf32(code)を返します。 }}

5 Answer


4


この質問を参照してください。 列のインデックスをExcelの列名に変換

最初のリンクの一番上に正しい答えがあり、2番目のリンクには正しくないものがいくつかあります。


4


どの再帰関数も等価な反復関数に変換できます。 最初に再帰的に考えるのはいつも簡単です。

静的文字列GetColumnName(int index){const int alphabetsCount = 26;

if(index> alphabetsCount){return GetColumnName(index / alphabetsCount)GetColumnName(index%alphabetsCount); } else {int code =(index  -  1)(int) 'A'; char.ConvertFromUtf32(code)を返します。 }}

これは次のように簡単に変換できます。

静的文字列GetColumnName(int index){const int alphabetsCount = 26; string result = string.Empty;

while(index> 0){result = char.ConvertFromUtf32(64(index%alphabetsCount)) index / = alphabetsCount; }

結果を返します。 }

それでも、ジョエルに耳を傾けてください。


0


再帰は1つの可能性です。+ index> 26 + `の場合、この呼び出しで + index%26 + を処理し、それを + index / 26 + `の再帰呼び出しに連結します。 ただし、反復は多くの場合より高速であり、このような単純な場合を調整するのは難しくありません。 疑似コードの場合:

string result =
while index > 26:
  index = index / 26
  result =  + result
return result

など。


0


静的文字列GetColumnName(int index){const int alphabetsCount = 26;文字列result = '';

if(index> = alphabetsCount){result = GetColumnName(index-alphabetsCount)} return(string)(64 index); }

私のC#は大変で錆びています。 これを疑似コードとして解釈します - ほとんど確実にコンパイルされませんが、始めることができます。


-1


私はC#で質問に答えたくはありませんが、Haskellでこれがどれほど簡単かを説明します。

alphas :: [String] alphas = [x [c] | x < - ([]:alphas)、c < -  ['A' .. 'Z']]

プレリュード> 100アルファを取る["A"、 "B"、 "C"、 "D"、 "E"、 "F"、 "G"、 "H"、 "I"、 "J"、 "K"、 "L"、 "M"、 "N"、 "O"、 "P"、 "Q"、 "R"、 "S"、 "T"、 "U"、 "V"、 "W"、 "X "、" Y "、" Z "、" AA "、" AB "、" AC "、" AD "、" AE "、" AF "、" AG "、" AH "、" AI "、" AJ "、 "AK"、 "AL"、 "AM"、 "AN"、 "AO"、 "AP"、 "AQ"、 "AR"、 "AS"、 "AT"、 "AU"、 "AV"、 "AW "、" AX "、" AY "、" AZ "、" BB "、" BC "、" BD "、" BE "、" BF "、" BG "、" BH "、" BI "、 "BJ"、 "BK"、 "BL"、 "BM"、 "BN"、 "BO"、 "BP"、 "BQ"、 "BR"、 "BS"、 "BT"、 "BU"、 "BV" "、" BW "、" BX "、" BY "、" BZ "、" CA "、" CB "、" CC "、" CD "、" CE "、" CF "、" CG "、" CH "、 「CI」、「CJ」、「CK」、「CL」、「CM」、「CN」、「CO」、「CP」、「CQ」、「CR」、「CS」、「CT」、「CU」 "、"履歴書"]