C++で列番号からスプレッドシートの列タイトルを求めるプログラム
正の整数が与えられたとき、その数値に対応するスプレッドシート(Excelなど)の列タイトルを求める問題を考えます。対応関係は、1→A、2→B、26→Z、27→AA、28→AB のようになっています。
例えば、入力が29の場合、出力は「AC」になります。
解決のアプローチ
この問題は、26進法の考え方を使って次の手順で解くことができます。
- n が0でない間、以下を繰り返します。
- n を n − 1 に更新する
- res に (n mod 26) + 'A' のASCII文字を追加する
- n を n / 26 に更新する
- res を反転させる
- res を返す
ここで n を事前に1減らしているのは、列番号が1始まりである一方、剰余演算は0始まりで行われるためです。この調整によって、Z(26)からAA(27)への桁上がりの境界も正しく処理できます。また、下位の文字から順に求まるため、最後に文字列を反転させて正しい順序にしています。
実装例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string convertToTitle(int n) {
string res;
while(n){
res += (--n)%26 + 'A';
n /= 26;
}
reverse(res.begin(), res.end());
return res;
}
};
main(){
Solution ob;
cout << (ob.convertToTitle(30));
}入力
30
出力
AD
処理の流れの解説
入力が30の場合の動作を見てみましょう。まず n が29に減らされ、29 mod 26 = 3 となるため 'D' が追加され、n は 29 / 26 = 1 になります。次に n が0に減らされ、0 mod 26 = 0 となるため 'A' が追加され、n は0になってループが終了します。この時点で res は "DA" となっているため、反転することで最終的な答え "AD" が得られます。
-
グリッド内で照らされているセルの数を求めるC++プログラム
問題の概要 ここでは、縦 h × 横 w のサイズを持つグリッドが与えられたとき、光で照らされているセルの数を求めるC++プログラムを紹介します。グリッドのセルには「電球」または「障害物」が置かれています。電球のあるセルは、そのセル自身と上下左右のセルを照らし、光は障害物に遮られない限りまっすぐ伝わっていきます。一方、障害物のあるセルは照らされることがなく、電球の光を遮って他のセルへ光が届かないようにします。電球の位置を配列 bulb、障害物の位置を配列 obstacles として受け取り、グリッド全体で照らされているセルの合計数を求めます。 たとえば、入力が h = 4、w = 4、bulb
-
C++で与えられた点から作成できる四角形の数を求める方法
四角形とは? 四角形(クアドララテラル)とは、ユークリッド平面上で4つの頂点と4つの辺を持つ多角形のことを指します。「4-gon」という呼び方もあり、正方形や長方形なども四角形の一種に含まれます。 本記事では、与えられた点から作成できる四角形の数を求める手法について解説します。この問題では、直交座標系(XY平面)上に与えられた4つの点 (x, y) を用いて、いくつの四角形を構成できるかを求めます。まず、具体的な入力例と出力例を見てみましょう。 入力 : A( -2, 8 ), B( -2, 0 ), C( 6, -1 ), D( 0, 8 ) 出力 : 1 説明 : 作成できる四角形は1つだ