はるのぶろぐ。

情報系大学生ハルが、ゆるゆるとIT関係についてや日々の雑記を綴ります。ちょっとだけ、あなたの役に立てる、そんなブログを目指しています。

【AtCoder】超初心者のためのモノグサプログラミングコンテスト2022A問題の解説【C言語】【ABC238】

参加してます!ポチッとお願いします

記事名と
URLをコピー

こんにちは、情報系大学生のハル(Blog_IT_haru)です。

今回は、C言語AtCoder(ABC238)に参加したので、自分の復習を兼ねてまとめていきたいと思います。

なお、私は灰色coderで、まだ3つしか参加したことが無く、しかも今回入れずに最後に参加したのは2年前です。

超初心者ですので、A問題しか解説は出来ないと思いますが、備忘録的にまとめていきます。

f:id:Blog_IT:20220206140733p:plain

問題

A問題 Exponential or Quadratic

2n>n2か?

制約:nは1以上109以下の整数

入力はnと与えられる。

2n>n2ならYesを、そうでないならNoを出力する。

参考元:Editorial - Monoxer Programming Contest 2022(AtCoder Beginner Contest 238)

正解率

灰コーダーの正解率もとても高いので、とても簡単な問題だったと思います。

灰コーダー正解率:92.2 %
茶コーダー正解率:98.1 %
緑コーダー正解率:97.1 %

引用元:【AtCoder解説】PythonでABC238のA,B,C,D,E問題を制する! - Qiita

 

私の考え方

私はとりあえず2nとn2を求めるという方向で考えました。

  1. 与えられたnを、まずscanfで読み取る。
  2. pow関数を用いて、2nとn2を求める。
  3. if関数で、2n>n2ならYesを、そうでないならNoをprintfで出力する。

私のソースコード

#include <stdio.h>
#include <math.h>
int main(void){
    int n;
    scanf("%d",&n);
    double answer = pow(2,n);
    int answer2 = n*n;
    if(answer>answer2){
        printf("Yes\n");
    }
    else if(answer<answer2){
        printf("No\n");
    }
    else {
        printf("No\n");
    }
}

公式の解説・考え方

公式の解説は以下より確認できます。

Editorial - Monoxer Programming Contest 2022(AtCoder Beginner Contest 238)

公式では、数学の知識を用いていて、以下のように考えています。

『2≦n≦4のときはNo、そうでないとき答えはYesとなる。』

n=1のとき、2n>n2となりYesであり、2≦n≦4で2n≦n2となるのは、計算すれば明らかです。

また、n が 4 よりも大きい自然数のとき、2n>n2となることは、数学的帰納法により証明できます。

これについては、数学的帰納法(不等式)のページの例題2より解説がなされています。

公式の考え方で解くと、以下のような感じになると思います。

(私のやつよりスッキリしてますね笑)

公式の考え方のコード

#include <stdio.h>
int main(void){
    int n;
    scanf("%d",&n);
    if(2<=n && n <=4){
        printf("No\n");
    }
    else{
        printf("Yes\n");
    }
}

必要な知識

以下の知識が必要です。

※各項目をクリックすることで、該当の部分に飛べます。

scanfで値を読み取る方法

今回は、整数なので、以下の様に読み取ります。

int n;
scanf("%d",&n);

intは、型の種類の一つで、整数を取り扱います。

int型のサイズは4バイトで、最大値は2147483647、最小値は-2147483648となります。printf関数などを使って出力表示する際の変換指定子はdになります。

引用元:

【C言語入門】整数(int、long int、short int)の使い方 - 侍エンジニアブログ

このとき出てきた、%dのdが、変換指定子dです。

簡単に言うと、整数を読み取るためのものです。

scanf自体は、scanf(”書式文字列”, &変数名1, &変数名2, ・・・)というふうに使用します。(引用:【C言語入門】scanfで数値、文字列の入力(sscanfの使い方も解説) | 侍エンジニアブログ

書式文字列の中に、%dなどの変換指定子を書きます。

if文の使い方

過去に、if文について書いていた記事がありましたので、一部引用しました。

ifという文字通り、「~なら~する」という、条件で処理を実行するか否か決めることができます。

次のように使います。

または、

です。

(引用元:C言語で最大値を求める - ハルの初心者プログラミング部

ただ、私の考え方で解く場合はelse ifの知識も必要です。

以下のように使用します。

ifは最初の1つだけ、elseも最後の1つだけですが、else ifは何回でも使用することができます。

printfの使い方

過去に、printfについて書いていた記事がありましたので、一部引用しました。

printfは、文字列を表示するための関数です。

普通は、以下のように、文字列を記述するのですが、今回は整数の計算結果を記述したいので、少し違う書き方になりましたね。

普通の文字列の場合

整数の場合(今回)

このとき出てきた、%dのdが、変換指定子dです。

%d

printf内で使います。

整数を10進数で出力します。

int型に対応します。

使用例

この場合、10と出力されます。

\n

printf内で使います。

改行を行います。

先程の変換指定子の前か後に記入します。

前に記入した場合は前が改行され、後ろに記入した場合は後ろが開業されます。

今回も、見やすく出力するために、使用しました。

こんな感じですね。

(引用元:C言語で合計値を求める - ハルの初心者プログラミング部

powの使い方

公式の解き方では必要ありませんが、私の考え方で解くときは使います。

powは、累乗を求める関数で、以下のように、math.hをincludeする必要があります。

includeすれば、pow関数が使えるようになります。

とりあえずはそういうものだって思ってくれれば良いと思います。

#include <math.h>

pow関数は、戻り値、引数共にdouble型です。

2nを求める場合…↓

double answer = pow(2,n);

といった感じです。

pow(第1引数,第2引数)

powの引数は、第1引数が、基数(底)、第2引数が指数です。

double型とは??

8バイト、有効桁数16桁の倍精度浮動小数点実数で、int型では表現出来なかった小数点を含む数字も扱うことができます。

似た型として、float型が挙げられます。

ただし、float型は、4バイト、有効桁数7桁の単精度浮動小数点実数であり、double型のほうが、float型よりも、精度が高く表現することができます。

おすすめな記事

ABC238の、B問題とC問題の解説の記事もありますので、ぜひ読んでみてください。

blog-it.hatenablog.com

blog-it.hatenablog.com

まとめ

いかがでしたか?

今回は、A問題のみでしたが、参考になってくれたら嬉しいです。

復習がし終わったら、B問題などもやるかもしれません!

\ほんとの初心者の方は、本で学ぶのもおすすめ!/

以下の記事でおすすめ本紹介しています!

blog-it.hatenablog.com

この記事がいいな、と思ってくれたら、SNSなどで拡散したり、

ブックマークやコメントなどしてくれると励みになります!

下の方とサイドバーにある、サポートもお待ちしています!

更に、読者になってくれたら、お返しに私も読者になります!

また、この記事の内容についてなにかありましたら、

お問い合わせ、コメント、TwitterのDMなどによろしくお願いします。

それでは。