この記事では、プログラミング言語「Fortran」で競技プログラミングに挑む、その入り口まで案内します。
色んなコンテストがありますが、ここでは「AtCoder」という日本語のサイトで行われるコンテストをターゲットに説明します。
※前の記事はコチラ
Fortranで競技プログラミング入門!(AtCoder) - プログラミングを上達させたい
前回の記事では、Fortranで日本の競技プログラミングサイトAtCoderに解答を提出するまででした。
AtCoder
今回は、プログラミングの基礎である
・条件分岐
・ループ(繰り返し)
を使った問題まで解いてみます。
また、チョイスする問題は、僕が書いた入門用の問題をまとめた下記の記事から選んでいます。
frfrfrfr.hatenablog.com
※この記事は、このサイトを参考にしました。
Fortran 入門: 条件分岐(IF 文)
Fortran 入門: 繰り返し(DO 文)
今回の流れ
Fortranにおける条件分岐の書き方
Fortranでは、条件分岐(=if文)はこう書きます。
たとえば、"aが3未満ならaに4を代入"はこうです。
if (a < 3) then a = 4 end if
"then"とか、少し面倒ですが、そのぶん"{}"がいらないのは少し嬉しいかもですね。
また、elseも使って
"aが3以下ならaに4を代入、aが7以上ならaに6を代入、そうじゃないならaに100を代入"ならこうです。
if (a <= 3) then a = 4 else if (a >= 7) then a = 6 else a = 100 end if
条件分岐を使った問題を解く
この問題を解きましょう。
abc020.contest.atcoder.jp
解答の途中まではこんな感じです。
ここから一部変更して、完成させてみてください。
program atcoder implicit none integer i read *, i ! 変数iに、標準入力から数字を読み込み代入する ! ここに、iが1か2かによって何を出すか変えるプログラムを書く end program atcoder
どうでしょう?できそうでしょうか。
この記事の最後に解答を書いておきますので、分からなかった方はそちらを見て、再度自分で書いてみてください。
また、上記の問題が解けた方は、次の問題を解いてみてください。数学の問題に見えるかもしれませんが、条件分岐のみで答えられます。
A: haruki、気になります! - CODE FESTIVAL 2014チーム対抗早解きリレー | AtCoder
Fortranにおける繰り返しの書き方
繰り返し、他の言語ならよく"for"で書かれるものですね。
Fortranで、たとえば"1から10まで出力する"のはこう書きます。
より詳細に言うと、"iを1から10に変化させる、そしてiが1から順に1ずつ増えていくたびにiを値を出力する"というコードです。
do i=1, 10 print '(i0)', i end do
繰り返しを使った問題を解く
この問題を、"繰り返しを使って"解きましょう。
abc043.contest.atcoder.jp
※前の記事で扱った問題です。
この問題は、入力がnの場合、
が答えとなります。
この答え方はスマートですが、せっかくプログラミングをするので、泥臭く書いてみましょう。
つまり、"本当に1からnまで足してみる"という解答です。
program atcoder implicit none integer i, n, goukei read *, n ! 変数nに、標準入力から数字を読み込み代入する goukei = 0 ! 変数goukei を0とする ! do文を使ってここに"goukeiに1,2,3...,nまで足す"内容を書く print '(i0)', goukei end program atcoder
いかがでしょうか?
この記事の最後に解答を書いておきますので、分からなかった方はそちらを見て、再度自分で書いてみてください。
まとめ
以上となります。
Fortranでいくつか解答を提出してみたのですが、実行速度めちゃくちゃ速いですね・・・
さすが古いながら今まで使われているだけあります。
競技プログラミング界で、情報学とは全くの分野でFortranを使っているFortranerが増えたらさらに面白くなりそうですね。
ではでは、記事内で書いた問題の解答です。
★1つめ
program atcoder implicit none integer i read *, i ! 変数iに、標準入力から数字を読み込み代入する if (i < 2) then print '(i0)', 0 else print '(i0)', 1 end if end program atcoder
★2つめ
program atcoder implicit none integer i, n, goukei read *, n ! 変数nに、標準入力から数字を読み込み代入する goukei = 0 do i = 1, n goukei = goukei + i end do print '(i0)', goukei end program atcoder