Project Euler が提供している問題を解くための考え方を紹介してきました。最初の10問を紹介できたので、その10問について、どのような知識があれば解くことができるのか分析しました。
問題を解いた人数
以下は、問題別の解いた人数です(2022年8月14日時点)。
問題No | 問題を解いた人数 |
1 | 968869 |
2 | 773012 |
3 | 556367 |
4 | 492493 |
5 | 495838 |
6 | 498866 |
7 | 427162 |
8 | 358119 |
9 | 363154 |
10 | 332872 |
Project Euler では、アカウント作成直後から、すべての問題に挑戦することができるため、問1から問10から順番に解く必要はありません。そのため、問題の取り組みやすさは、解いた人数に現れてきます。
2022年8月14日時点で、1問でも解いた人は、1037913人いました(この1問は、問題1とは限りません)。一方、10問解いた人は、329332人で、1問でも解いた人との比率は、31.73%でした。アカウント登録して、1問解いても、10問解く人は3分の1以下になるようです。
最初の10問を解くために必要なプログラミングの知識
わたしは、C でプログラミングをしましたが、以下は、他の手続き型のプログラミング言語でも同じようなことが当てはまります。
C言語の前提知識
以下の文法知識を前提として、各問題を解くために、追加でどのような文法知識が必要か洗い出しました。改善版、別解で利用した文法要素も含みます。
- main 関数
- 独自関数定義と呼び出し
- 整数型変数の宣言、代入(=)
- 四則演算(+-*/)と余り(%)
- インクリメント演算子(++)とデクリメント演算子(--)
- 条件判断文(if 文、if – else 文)
- 繰り返し(for 文 と while 文)
- 等価演算子(== と !=)、関係演算子(<、<=、>、>=)
- 整数型変数の出力(stdio.h の #include と printf 関数)
問題別の追加要素
問題No | 問題を解くために必要な追加の C言語の文法要素 |
1 | 論理OR演算子(||) 代入演算子(+=) |
2 | 代入演算子(+=) |
3 | unsignd long long int 型 typedef による型定義 マクロ定数の定義 scanf による入力 |
4 | なし |
5 | unsignd long long int 型 typedef による型定義 break 文 代入演算子(*=) 関数の再帰呼び出し |
6 | 代入演算子(+=) |
7 | limits.h(MAX_INT を参照) マクロ定数の定義 break 文 配列 代入演算子(+=) 論理AND演算子(&&) |
8 | unsignd long long int 型 typedef による型定義 文字列 文字列の連結 配列 数字の文字コード(文字としての数字から数への変換) 型のキャスト continue 文 |
9 | マクロ定数の定義 |
10 | unsignd long long int 型 typedef による型定義 マクロ定数の定義 break 文 代入演算子(+=) 型のキャスト 配列 マクロ関数の定義 |
わたしは、プログラムをなるべく平易に書くように努めていて、使う文法要素も絞っていたつもりでしたが、細かく調べてみると、多くの文法要素を使っていました。
そのプログラミング言語が定めている文法を可能な限り利用してプログラムを記述することと、よく知られている文法を使って平易に書くことのバランスを考えて、書き方を採用しているつもりです。これは次回の話題とさせてください。
最初の10問を解くために必要な数学的な知識
数学的な知識も洗い出してみましょう。自然数の概念と四則演算は前提知識とします。
問題No | 問題を解くために必要な数学の知識 |
1 | 倍数の考え方 数列の和の公式(1から$N$の和) |
2 | 漸化式の考え方 フィボナッチ数列の定義 合同式の考え方(考察で利用) |
3 | 素数の定義 素因数分解 |
4 | 10進法の記法のしくみ(位取り記数法) 倍数の考え方 |
5 | 倍数の考え方 素数の定義 最大公約数 ユークリッドの互除法 |
6 | 数列の和の公式(1から$N$の和と2乗の公式) |
7 | 素数の定義 |
8 | なし(掛け算の知識があれば解ける) |
9 | ピタゴラス数の性質 |
10 | 素数の定義 エラトステネスの篩 |
高校数学の範囲の知識は必要ですが、多くは高校1年で履修する範囲です。Project Euler は数学的な要素が強い問題を提供していますが、数学の知識をそれほど必要としない問題もあることが分かります。
最後に
Project Euler の最初の10問について、以下を整理しました。
- どれくらいプログラミングの知識が必要なのか
- どれくらい数学の知識が必要なのか
C言語と数学について、どれくらいの知識があれば、プログラミングが書けるようになるのか、別の記事で考察します。