C++の出力ストリーム操作で数値の先頭にゼロを付けて出力する方法
C++で数値を出力する際、先頭にゼロ(先行ゼロ)を付けたいケースはよくあります。しかし、数値の前に直接「0」を並べて書いても、それらのゼロはすべて無視され、実際の数値だけが表示されてしまいます。
この問題はC言語ではprintfのフォーマット指定子のオプションで解決できますが、C++では
以下のコードでsetw()とsetfill()の使い方を確認してみましょう。
サンプルコード
#include<iostream>
#include<iomanip>
using namespace std;
int main() {
int number = 256; // 00000256 のように合計8桁で表示したい
cout << setw(8) << setfill('0') << number;
}実行結果
00000256
この例では、まずsetw(8)によって出力フィールドの幅を8文字に設定し、続くsetfill('0')で余白を「0」で埋めています。その結果、256が「00000256」として整形され、目的どおりの形式で出力されます。
なお、setw()やsetfill()による設定は、次の1回の出力に対してのみ有効である点に注意してください。複数の値を連続して同じ形式で出力したい場合は、それぞれの出力ごとに再度指定する必要があります。日付や時刻、ID番号など桁数を揃えたいデータの表示に、この手法は非常に便利です。
-
C++で解く「3nスライスのピザ」問題 ― 動的計画法でスライスの合計を最大化する方法
問題の概要 大きさがまちまちの 3n 個のスライスからなるピザがあるとします。私と友人2人は、次のルールに従ってピザを取っていきます。 私が任意のスライスを1枚選びます。 友人のAmalは、私が選んだスライスの反時計回り方向に隣接するスライスを取ります。 友人のBimalは、私が選んだスライスの時計回り方向に隣接するスライスを取ります。 ピザのスライスがなくなるまで、この手順を繰り返します。 各スライスの大きさは、時計回りの順に並べた環状配列 slices として与えられます。求めるのは、私が手にできるスライスの大きさの合計の最大値です。 入出力例 入力が [9, 8, 6, 1, 1,
-
C++で二分木を見やすい形式で2次元配列に出力する方法
本記事では、二分木(バイナリツリー)を m×n の2次元文字列配列として整形して出力する方法を解説します。出力には以下のルールが適用されます。行数 m は、与えられた二分木の高さと一致すること。列数 n は、必ず奇数になること。ルートノードの値は、最初の行のちょうど中央に配置する。ルートノードが存在する行と列によって、残りの領域は「左下」と「右下」の2つの部分に分割される。左側の部分木は左下の領域へ、右側の部分木は右下の領域へそれぞれ出力する。左右の領域は同じサイズとする。片方の部分木が存在しない場合でも、何も出力はしないものの、もう一方の部分木と同じサイズの領域は確保しておく必要がある。ただ