Official

A - 484558 Editorial by m_99


プログラミングの学習を始めたばかりで何から手をつけるべきかわからない方は、まずは「practice contest」(https://atcoder.jp/contests/practice/) の問題A「Welcome to AtCoder」をお試しください。言語ごとに解答例が掲載されています。
また、プログラミングコンテストの問題に慣れていない方は、「AtCoder Beginners Selection」(https://atcoder.jp/contests/abs) の問題をいくつか試すことをおすすめします。
「競プロ典型 90 問」(https://atcoder.jp/contests/typical90) では、プログラミングコンテストで扱われる典型的な 90 問の問題に挑戦可能です。
「C++入門 AtCoder Programming Guide for beginners (APG4b)」(https://atcoder.jp/contests/APG4b) は、競技プログラマー向けのC++入門用コンテンツです。


本問は以下のようにして解くことが出来ます。

  1. \(N\) をちょうど \(2\) 桁の \(16\) 進表記に変換した場合において各桁の数字が \(0,1,2,\ldots,15\) のどれになるかを求める。
  2. 求めた数字を\(16\) 進表記のもの( 0123456789ABCDEF )に直して出力する。

各桁の数字を求める

\(N\) をちょうど \(2\) 桁の \(16\) 進表記に変換した場合において各桁の数字が何になるかを求める」ということは、次のことに等しいです。

  • \(0\) 以上 \(16\) 未満の整数 \(a,b\) であって、\(N=16a+b\) を満たすものを求める。

そして、これは \(a=\lfloor \frac{N}{16} \rfloor, b=N \bmod 16\) として求められます。C++では以下のように記述すれば良いです。

a = N/16, b = N%16;

数字を \(16\) 進表記のものに直して出力

\(a,b\)\(9\) 以下の場合はそのまま出力すれば良いです。\(10\) 以上の場合は、\(10\) ならば A\(11\) ならばB\(\ldots\) としないといけませんが、C++では以下のように記述することで \(a\) に対応する英大文字を求められます。

(char)('A' + (a-10))

以上に基づき、\(a,b\) それぞれについて場合分けをしながら出力を行えば所望の出力が得られます。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;

int main() {
    
	int N;
	cin>>N;
	
	int a,b;
	a = N/16, b = N%16;
	
	if(a<=9)cout<<a;
	else cout<<(char)('A'+a-10);
	
	if(b<=9)cout<<b;
	else cout<<(char)('A'+b-10);
	
	return 0;
}

posted:
last update: