C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でExcelの列番号を列名(アルファベット)に変換する方法


Excelの列名はアルファベットで構成されています。Aから始まり、Zの次はAA、ABと続き、ZZの後はAAA、AABとZZZまで進み、さらにその後も続いていきます。つまり、列番号1は「A」、列番号26は「Z」、列番号27は「AA」に対応します。本記事では、列番号が与えられたときに、対応する列名(アルファベット)を求める方法を解説します。例えば、列番号が80であれば「CB」になります。

アルゴリズムの考え方

数値nが与えられた場合、まず26で割った余りを求めます。この問題は26進数への変換に似ていますが、Excelの列名には「0」に相当する文字が存在しないため、少し工夫が必要です。

余りが0の場合、その桁は「Z」に相当します(nが26、52などのケース)。このとき、出力用の文字列に「Z」を追加し、nを n/26 - 1 で更新します。余りが0でない場合は、余りに対応する文字((余り - 1) + 'A')を文字列に追加し、nを n/26 で更新します。この処理をnが0になるまで繰り返し、最後に文字列を反転して出力すれば完成です。

C++による実装例

#include<iostream>
#include<algorithm>
using namespace std;
void showColumnLetters(int n) {
   string str = "";
   while (n) {
      int rem = n%26;
      if (rem==0) {
         str += 'Z';
         n = (n/26)-1;
      }
      else{
         str += (rem-1) + 'A';
         n = n/26;
      }
   }
   reverse(str.begin(), str.begin() + str.length());
   cout << str << endl;
}
int main() {
   int n = 700;
   cout << "Cell name of " << n << " is: ";
   showColumnLetters(700);
}

実行結果

Cell name of 700 is: ZX

処理の流れを確認(n = 700の場合)

n = 700 の場合の処理の流れを追ってみましょう。

  • 1回目のループ: 700 % 26 = 24 → 「X」を追加し、n = 700 / 26 = 26 に更新
  • 2回目のループ: 26 % 26 = 0 → 「Z」を追加し、n = 26 / 26 - 1 = 0 に更新

この時点で文字列は「XZ」となっているため、最後に反転処理を行うことで「ZX」が出力されます。このように、余りを利用したシンプルな繰り返し処理と文字列の反転だけで、任意の列番号からExcelの列名を効率よく求めることができます。


  1. C++で方程式 n = x + n⊕x の解の個数を求める方法

    本記事では、方程式 n = x + n ⊕ x の解の個数を求める方法を解説します。つまり、与えられた n に対して、この等式を満たす x の値がいくつ存在するかを求める問題です。ここで「⊕」はXOR(排他的論理和)演算を表します。 それでは、具体例を挙げながら、n = x + n ⊕ x の解の個数について詳しく見ていきましょう。 全探索(ブルートフォース)による解法 最もシンプルなのが全探索(ブルートフォース)のアプローチです。与えられた n に対して、x の候補として 0 から順に整数を代入し、等式が成り立つかどうかを1つずつ確認していきます。なお、x の範囲は 0 以上 n 以下に限定

  2. C++で与えられた点から作成できる四角形の数を求める方法

    四角形とは? 四角形(クアドララテラル)とは、ユークリッド平面上で4つの頂点と4つの辺を持つ多角形のことを指します。「4-gon」という呼び方もあり、正方形や長方形なども四角形の一種に含まれます。 本記事では、与えられた点から作成できる四角形の数を求める手法について解説します。この問題では、直交座標系(XY平面)上に与えられた4つの点 (x, y) を用いて、いくつの四角形を構成できるかを求めます。まず、具体的な入力例と出力例を見てみましょう。 入力 : A( -2, 8 ), B( -2, 0 ), C( 6, -1 ), D( 0, 8 ) 出力 : 1 説明 : 作成できる四角形は1つだ