UP | HOME

第13回 アカデミックスキルII C言語(6) 余裕がある人向けの課題

Table of Contents

1 このページの更新履歴

2 Project Euler からの問題例

http://projecteuler.net に様々な課題例が挙げられている. 今回の情報基礎Bで取り扱う知識(変数,分岐と繰返し)だけで長江が実際に解いた問題を,先頭から順に 21問 ピックアップして訳をつけておいた. 各問題のタイトルにつけた★の数で難易度を表している.ぜひ挑戦してみて欲しい.

  • ★ = 基本が判っていれば容易に解ける
  • ★★ = ソースコードが長くなるので時間がかかるが,解けなくはない
  • ★★★ = コーディング以前に頭をヒネらないと解けない

なお,ここに載っていない問題は,それぞれ,以下の理由で解けないと判断している:

Problem 8 数列の中で最大の積
問題文にある数列を扱うには 配列 が必要.
Problem 11 格子の中で最大の積
問題文にある格子を表現するには 配列 が必要.
Problem 13 大きな和
50桁の数字を扱うには 配列 が必要.
Problem 15 格子上の経路
右と下を20回づつ選ぶ組み合わせなので 40C20 を計算すればよいのだが, 講義の知識だけで扱える整数の最大値を超えている.
Problem 16 べき乗の桁の和
同じく講義の知識だけ扱える整数の最大値を超えてしまう.
Problem 18 最大経路和 I
問題文の三角形を表現するには 配列 が必要.
Problem 20 階乗の桁の和
講義の知識だけ扱える整数の最大値を超えてしまう.
Problem 22 名前の点数
ファイルの入出力が必要.
Problem 25 1000桁の Fibonacci 数
講義の知識だけ扱える整数の最大値を超えてしまう.
Problem 29 重複のないべき乗数
重複の有無を確認するのに 配列 が必要.

2.1 3もしくは5の倍数(Problem 1) ★

10未満の3もしくは5の倍数は, 3, 5, 6, 9 でその和は 23 である.

1000未満の3もしくは5の倍数の和を求めよ.

2.2 偶数の Fibonacci 数(Problem 2) ★

Fibonacci 数列 F(1), F(2), F(3), ... において,=F(n)= の値は F(n-1)F(n-2) の和で与えられる. F(1) = 1, F(2) = 2 とするとき,最初の10個の項は

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

となる.

400万以下の Fibonacci 数列の中で,偶数のものの和を求めよ.

2.3 最大の素因数(Problem 3) ★

13195 の素因数は 5, 7, 13 および 29 である. 600851475143 の素因数の中で最大のものを求めよ.

600851475143int 型で取り扱える最大値(2147483647)よりも大きいので, unsigned long int (符号無し倍長整数型)を使うこと.

2.4 積として作れる最大の回文数(Problem 4) ★

回文数(palindrome)とは, 11, 101, 12321 など, 右からも左からも同じように読める整数である. 2桁の整数の積として作れる最大の回文数は 9009 = 91 x 99 である.

3桁の整数の積として作れる最大の回文数 を求めよ.

2.5 最小の係数(Problem 5) ★

25201 から 10 のいずれの整数でも割り切れる最小の数である. 1 から 20 のいずれの整数でも割り切れる最小の正の整数を求めよ.

2.6 「二乗の和」と「和の二乗」の差(Problem 6) ★

最初の10個の自然数の 二乗の和

1^2 + 2^2 + ... + 10^2 = 385

である.最初の10個の自然数の 和の二乗

(1 + 2 + ... + 10)^2 = 55^2 = 3025

である.従って,最初の10個の自然数の二乗の和と和の二乗の差は 3025 - 385 = 2640 である.

最初の100個の自然数の「二乗の和」と「和の二乗」の差を求めよ

2.7 10001番目の素数(Problem 7) ★

素数を小さい順に並べると 2, 3, 5, 7, 11, 13 であるから,6番目の素数は 13 と判る. 10,001番目の素数を求めよ

2.8 特別なピタゴラス3つ組(Problem 9) ★

ピタゴラス3つ組(Pythagorean triplet) (a, b, c) とは, a < b < c なる自然数で,

a^2 + b^2 = c^2

を満足するものである.例えば, 3^2 + 4^2 = 5^2 なので, (3,4,5) はピタゴラス3数である.

ピタゴラス3数 (a,b,c)a + b + c = 1000 となるものの積 abc を求めよ

2.9 素数の和(Problem 10) ★

10未満の素数の和は 2 + 3 + 5 + 7 = 17 である.

200万未満の素数の和を求めよ

2.10 高次の割り切れる三角数(Problem 12) ★

三角数の順列 T(1), T(2), ... は,前の項に自然数を加えていくことで生成される.例えば, 7番目の三角数は T(7)=1+2+3+4+5+6+7=28 となる. 最初の10個の三角数は

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

である.

最初の7個の三角数の約数を列挙すると,

1: 1
3: 1,3
6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28

となり, 5個を超える約数を持つ最初の三角数28 であることが判る.

500個を超える約数を持つ最初の三角数 を求めよ

2.11 最長の Collatz 列 (Problem 14) ★

正の整数に対して, 下記のルールに従って生成される数列を考える:

n -> n/2 (n が偶数)
n -> 3n+1 (n が奇数)

このルールに従って 13 から生成した数列は,

13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1

となり, (13 から始まって 1 まで終わるまで)10個の項で構成される. 厳密な証明はされていない(Collatz 問題)ものの,この数列はどのような整数から始まっても 1 で終わると考えられている.

数列長が最も長くなるような 100万未満の最初の数を求めよ

注意: 生成された数列に100万以上の数値が含まれていてもよい.

2.12 数字の「文字数」をカウント (Problem 17) ★★

1から5までの数字を単語で書き下すと one, two, three, four, five となり,そこで使われる文字数は全部で 3 + 3 + 5 + 4 + 4 = 19 個である.

1から1000 (one thousand) までの数字を単語で書き下した時,使われる文字数を求めよ

注意: 空白やハイフンはカウントしない.例えば, 342 (three hundred and forty-two) には 23 文字が含まれ, 115 (one hundred and fifteen) には 20文字が含まれる. 文字を書き下す際の "and" の用法は, British usage (例えば, ここあたり を参考に) に従う.

2.13 日曜日の数 (Problem 19) ★★

下記の情報が与えられている.

  • 1900年1月1日は月曜日
  • 4月, 6月, 9月, 11月は 30日
  • 2月は閏年ならば 29日, 平年(閏年でない)なら 28日
  • それ以外の月(1月, 3月, 5月, 7月, 8月, 10月, 12月)は31日
  • 閏年は「4で割り切れるが100では割り切れない年」または「400で割り切れる」年.

20世紀(1901年1月1日から2000年12月31日)の間で,日曜日で始まる月はいくつかあるか求めよ

2.14 友愛数の和 (Problem 21) ★★

d(n) を n の真の約数(proper divisors; n より小さい約数)の和とする. もし2つの整数 a != b について d(a) = b かつ d(b) = a であるとき, a と b は互いに友好的(amicable)であると呼び, a と b のそれぞれを 友愛数(amicable numbers) と呼ぶ.

例えば, 220 の真の約数は 11, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 なので d(220) = 284 である. 284 の真の約数は 1, 2, 4, 71, 142 なので d(284) = 220 である.

10000より小さい友愛数の和を求めよ

2.15 過剰数の和で表せない数 (Problem 23) ★★

完全数とは, その真の約数の和が,その数自身に一致する数である.例えば, 28 の真の約数の和は 1 + 2 + 4 + 7 + 14 = 28 であるから, 28は完全数である.

ある数 n について,その真の約数の和が n より小さい時は 不足数(deficient), 和が n より大きい時は 過剰数(abundant) と呼ばれる.

最小の過剰数は 12 (1 + 2 + 3 + 4 + 6 = 16)であるため,2つの過剰数の和で表される 最小の数は 24 となる.数学的な解析によって, 28123 より大きな整数は 全て 2つの過剰数の和で表されることが明らかになっている. 「2つの過剰数の和で表せない最大の数」がこの上限よりも小さいことは分かっているのだが, 解析的にこの上限を減らすことはできていない.

2つの過剰数の和で表せない正の整数の総和を求めよ

2.16 辞書式の順列 (Problem 24) ★★★

順列(permutation)とは,順序つきの並びである.例えば, 3124 は10進数 1, 2, 3, 4 の順列の1つである. 全ての順列が数値もしくはアルファベット順に並べたものを,辞書式順序(lexicographic order)と呼ぶ. 0, 1, 2 の辞書式順列は

012, 021, 102, 120, 201, 210

である.

0, 1, 2, 3, 4, 5, 6, 7, 8, 9 からなる順列のうち,辞書式順序で 100万番目 になるものを求めよ

2.17 逆数の循環 (Problem 26) ★★★

単位分数(unit fraction)は分子が1の分数である. 2から10までを分母に持つ単位分数を10進数で表すと,

1/2     =       0.5
1/3     =       0.(3)
1/4     =       0.25
1/5     =       0.2
1/6     =       0.1(6)
1/7     =       0.(142857)
1/8     =       0.125
1/9     =       0.(1)
1/10    =       0.1

となる.ここで, 0.1(6)は 0.166666… を意味し, 1桁の循環(recurring cycle)を持つ. 1/7 は 6桁の循環を持つことが判るだろう.

1000未満の整数(d < 1000)の中で,1/n の小数部分に含まれる循環が最も長くなるものを求めよ.

2.18 二次式の素数 (Problem 27) ★★

Euler は下記の並外れた二次式を発見した:

n^2 + n + 41

この式は, n に 0 から 39 を順に代入することで 40 個の素数を生成できることが判っている. しかし, n = 40 の時には, 402 + 40 + 41 = 40 (40 + 1) + 41 は 41 で割り切れるし,当然ながら, n = 41 の時には, 412 + 41 + 41 は明らかに 41 で割り切れる.

後に, 別の二次式 n ^ 2 - 79 * n + 1601 が発見された.この式は n に 0 から 79 を順に代入することで, 80 個の素数を生成できる. この係数 -79 と 1601 の積は -126479 である.

次の形の二次式:

n^2 + a * n + b, |a| < 1000, |b| < 1000

を考える.ただし, |a|, |b| は, それぞれ, ab の絶対値を表す. n = 0 から順に値を代入していったときに, 最も多くの素数を生成するようなこの二次式の係数 ab の積を求めよ.

2.19 数の螺旋の対角要素 (Problem 28) ★

1 から右に時計回りに数値を並べて 5 x 5 の螺旋(spiral)を構成すると

21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13

となる.このとき,対角要素の和は 101 となる.

同様の方法で 1001 x 1001 の螺旋を構成したときの対角要素の総和を求めよ.

2.20 各桁の5乗 (Problem 30) ★

驚くべきことに,その各桁の4乗の和で表せるような数は,以下の3つしかない:

1634 = 1^4 + 6^4 + 3^4 + 4^4
8208 = 8^4 + 2^4 + 0^4 + 8^4
9474 = 9^4 + 4^4 + 7^4 + 4^4

ただし, 1 = 14 は「和」ではないので含まない.これらの数の和は 1634 + 8208 + 9474 = 19316 である.

「その各桁の5乗の和で表される数」の総和を求めよ

2.21 コインの和 (Problem 31) ★

英国の貨幣は£(ポンド)トp(ペンス)で構成され,下記の8種類のコインが一般に流通している:

1p, 2p, 5p, 10p, 20p, 50p, £1 (100p), £2 (200p).

以下の方法で £2 を作ることができる.

1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p

これらのコインを使って £2 を作るには何通りの方法があるか?

Author: Takeshi Nagae

Created: 2014-07-02 Wed 18:41

Emacs 24.3.1 (Org mode 8.2.5h)

Validate