C++入門 AtCoder Programming Guide for beginners (APG4b) 第1章(実践2)

APG4b第1章(実践2) プログラミング

前回の記事でC++入門 AtCoder Programming Guide for beginners(APG4b)第1章の「1.00.はじめに」~「EX3 – 計算問題」まで進みましたので、今回はその続きを進めて行きたいと思います。
まずは以下のサイトへアクセスしてログインしましょう。

AtCoderProgrammingGuideforbeginners(APG4b)トップ画面

引用元:https://atcoder.jp/contests/APG4b

1.04.変数と型

1.04.変数と型

ここのページに書かれている内容の「変数」について補足します。
【変数名のルール】内の「利用できない変数名」の対象として・キーワード(C++が使っている一部の単語)と記載があり、無意識にキーワードを変数名として使用することはあまり無いので気にしなくて良いと書かれていますが、一応、マイクロソフトの「C++キーワード」というページに「標準のC++ キーワード」が記載されているので気になった方は確認してください。

EX4 – ◯年は何秒?

EX4 – 〇年は何秒?

問題文に記されたプログラムの6行目「int seconds = 365 * 24 * 60 * 60;」は以下の計算により1年分の秒数を表しています。
1年 = 365日 、1日 = 24時間、 1時間 = 60分、 1分 = 60秒
よって10行目の2年は変数secondsの2倍、11行目の5年は5倍、12行目の10年は10倍となります。

EX4 – 〇年は何秒?:解答
#include <bits/stdc++.h>
using namespace std;

int main() {
  // 一年の秒数
  int seconds = 365 * 24 * 60 * 60;

  // 以下のコメント/* */を消して追記する
  cout << seconds << endl;
  cout << seconds * 2 << endl;
  cout << seconds * 5 << endl;
  cout << seconds * 10 << endl;
}

1.05.実行順序と入力

1.05.実行順序と入力

ここのページに書かれている内容については特に補足説明することはありません。
入力の ciin(しーいん) >> は出力の cout(しーあうと) << と逆向きの記号になるので気を付けましょう。
また、1.05、1.06、1.11、1.12、1.13、1.14にはAtCoder Beginner Contestの問題(ABC問題)という応用問題が用意されているので、これらも全て解いていきます。
ABC問題の先頭のアルファベット(AまたはB)は難易度を表しており、Aが易しめ、Bが難しめです。

EX5 – A足すB問題

EX5 – A足すB問題

コードテストの画面の「標準入力」欄に試してみたい値を記載し、実行ボタンをクリックすると、プログラム実行結果が「標準出力」欄に表示されるので、問題文の下に記載されている入力例1と入力例2に対して出力例1と出力例2が正しく表示されるか確認して、問題無ければ提出しましょう。

【入力例1と出力例1】

APG4b_C++_第1章_EX5_コードテスト_入力例1出力例1

【入力例2と出力例2】

APG4b_C++_第1章_EX5_コードテスト_入力例2出力例2
EX5 – A足すB問題:解答
#include <bits/stdc++.h>
using namespace std;

int main() {
  int A , B;
  cin >> A >> B;
  cout << A + B << endl;
}

1.05.ABC問題(A – New Year)

1.05.ABC問題(A – New Year)

12月は大晦日の31日まであるので、30日のM時から次の年になるまでの時間(年明けまでの時間)は
30日の残り時間(24 – M) と 31日の時間(24)を合わせた時間 ⇒  (48 – M)時間となります。
Mを整数型の変数で宣言し、その後で入力(cin >>)で受け取ります。
なお、問題にMというアルファベットで書かれていますが変数名は必ずしもMである必要はありません。

1.05.ABC問題(A – New Year):解答
#include <bits/stdc++.h>
using namespace std;

int main() {
  int M;
  cin >> M;
  cout << 48 - M << endl;
}

1.05.ABC問題(A – Rating Goal)

1.05.ABC問題(A – Rating Goal)

この問題は意味が伝わりにくいので、もう一度問題文を整理してみます。

① 現在のレーティング:a
② 次のコンテストのパフォーマンス:b
⇒ ③ 次のコンテスト終了時点のレーティング:( a + b )÷ 2

上記のような計算で決まるコンテストの成績について、もし「① 現在のレーティング:R」「③ 次のコンテスト終了時点のレーティング:G」だったとすると「② 次のコンテストのパフォーマンス」はいくらでしょう?っという問題です。
仮に求める値「② 次のコンテストのパフォーマンス」を 変数X とすると(R + X)÷ 2 = G となり、この式を変数Xの式に組み替えると X = 2G – R となります。

1.05.ABC問題(A – Rating Goal):解答
#include <bits/stdc++.h>
using namespace std;

int main() {
  int R , X , G;
  cin >> R >> G;
  X = 2 * G - R;
  cout << X << endl;
}

1.05.ABC問題(A – Bichrome Cells)

1.05.ABC問題(A – Bichrome Cells)

この問題はそんなに意味が伝わりにくくないですが念のため、もう一度問題文を整理してみます。
全部のマスの数は N × N で、すべてのマスは必ず白か黒のどちらかに塗られています。
白いマスの数がAだった時、黒いマスの数はいくらでしょう?っという問題です。

1.05.ABC問題(A – Bichrome Cells):解答
#include <bits/stdc++.h>
using namespace std;

int main() {
  int N , A;
  cin >> N >> A;
  cout << N * N - A << endl;
}

1.05.ABC問題(A – Round Up the Mean)

1.05.ABC問題(A – Round Up the Mean)

C++では整数型同士の割り算で小数が発生した場合、小数は切り捨てられる仕様です(詳しくは「1.03.四則演算と優先順位」を確認してください)
しかし、この問題では2つの正整数の平均値(足して2で割った値)が小数だった場合、小数を切り上げた値を求める問題です。
つまり、たとえば下記の①と②について、①は小数がないので答え2で問題ありませんが、②は小数があるので小数を切り上げて6になるようにしなければなりません。

① 2つの整数を足した合計が偶数の場合 ⇒ 2で割り切れるので小数なし
  例)1 + 3 ⇒ 4 ÷ 2 = 2
② 2つの整数を足した合計が奇数の場合 ⇒ 2で割り切れないので小数あり
  例)7 + 4 ⇒ 11 ÷ 2 = 5.5

この問題は頭の柔軟な発想が必要になる問題です。
上記の①、②について、2つの整数を足した合計に足す1をすると小数を切り上げたのと同じことになります。

①’ 2つの整数を足した合計が偶数の場合 ⇒ 足す1をする ⇒ 2で割り切れないので小数あり
  例)1 + 3 ⇒ 4 + 1 ⇒ 5 ÷ 2 = 2.5
②’ 2つの整数を足した合計が奇数の場合 ⇒ 足す1をする ⇒ 2で割り切れるので小数なし
  例)7 + 4 ⇒ 11 + 1 ⇒ 12 ÷ 2 = 6

1.05.ABC問題(A – Round Up the Mean):解答
#include <bits/stdc++.h>
using namespace std;

int main() {
  int a , b;
  cin >> a >> b ;
  cout << (a + b + 1) / 2 << endl;
}

1.05.ABC問題(A – Placing Marbles)

1.05.ABC問題(A – Placing Marbles)

この問題は「すぬけ君が1が書かれたマスにビー玉を置く」とか書かれていて意味が伝わりにくいのですが、要するに0と1で構成された三桁の数字(000、001、010、011、100、101、110、111のどれか)が入力されるので、その数字の中に1が何個あるか数えて表示しなさいっという問題です。
この問題を解くには入力される3桁の数字を一桁ずつバラバラにする必要があります。
入力される3桁の数字を変数S、その百の位の値を変数S1、十の位の値を変数S2、一の位の値を変数S3とすると、S1~S3は以下の式で求められます。

S1 = S / 100
S2 = (S – S1 * 100) / 10
S3 = S % 10

例えばS = 111 だった場合、以下のようになります。

S1 = 111 / 100 = 1.11 ⇒ 1 (小数切り捨て)
S2 = (111 – 1 * 100) / 10 = 11 / 10 = 1.1 ⇒ 1 (小数切り捨て)
S3 = 111 % 10 = 1 (111を10で割った余り)

1.05.ABC問題(A – Placing Marbles):解答
#include <bits/stdc++.h>
using namespace std;

int main() {
  int S , S1 , S2 , S3;
  cin >> S;
  S1 = S / 100;
  S2 = (S - S1 * 100) / 10;
  S3 = S % 10;
  cout << S1 + S2 + S3 << endl;
}

以上で1.05は終わりです。
最後の問題(A – Placing Marbles)の1桁ずつバラバラにする解き方は今後も他の問題で使いますので慣れておきましょう。
それでは今回はここまでにして、次回は「1.06.if文・比較演算子・論理演算子」から続きを進めて行きましょう。
お疲れさまでした。

<<1つ前の記事  1つ後の記事>>

コメント

タイトルとURLをコピーしました