問題8:チャレンジ問題

今までの知識を総動員してチャレンジする、ちょっと難易度高めの問題です。

prob8-1.(難易度★★)(ピタゴラス数)

a,b,cを、いずれも1以上100以下の整数とするとき、a*a+b*b=c*cを満たす、全てのa,b,cの組み合わせ全てと、その数を求め、画面に表示しなさい。ただし、a,bの数値の組み合わせが同じものも別のものとしてもかまわない。具体的には、a=3,b=4,c=5と、a=4,b=3,c=5は別の組み合わせとする。

prob8-2.(難易度★★)(ピタゴラス数2)

prob8-1.のデータから、重複を取り除いた組み合わせと、その数を表示するプログラムを作りなさい。具体的には、a=3,b=4,c=5と、a=4,b=3,c=5は同じものとみなす。

prob8-3.(難易度★★)(階乗を求める計算)

任意の数値の階乗を求めるプログラムを作りなさい。階乗とは、その数から一つずつ減らした全ての数を書けた数値のことであり、例えば、6の階乗は、6×5×4×3×2×1=720となる。

prob8-4.(難易度★★)(桁数を求める計算)

1から1000までの任意の数を乱数で発生させ、その数が何桁かを表示するプログラムを作りなさい。

prob8-5.(難易度★★)(いまさら世界のナベアツ計算)

1から100までの数値のうち、3で割り切れるか、数値の中に3が含まれる数値を全て表示しなさい。

prob8-6.(難易度★★★)(分数の計算1)

2つの分数同士の足し算をし、その結果を分数で表示するプログラムを作りなさい。このとき、分子、分母共に最大値が10で、最小値は分母が2、分子が1とする。それらの数値をランダムに発生させ、以下のように結果を表示させなさい。ただし、計算結果は、分子と分母がきちんと約分されていることとする。また、分子が分母の数で割り切れる場合は、整数として表示するものとする。


1/5 + 2/3 = 13/15     ← 通常のケース
2/3 + 3/8= 1.1/24     ← 帯分数になるケース

1/6 + 1/3= 1/2          ← 約分されるケース
1/2 + 1/2 = 1            ← 整数になるケース

prob8-7.(難易度★★★)(分数の計算2)

prob8-6のプログラムを発展させ、以下のように改良しなさい。ただし、計算前の二つの数値は、約分されていなくても良いものとする。また、表示方法は例に倣いなさい。
(1)2つの分数の分子、分母共に1から10までの乱数とする。
(2)分子が分母より大きい場合は、帯分数として表す。
(3)分子が分母で割り切れる場合は、整数として表す。


1.1/3 + 2.1/2 = 3.5/6
2/3 + 3/8= 1.1/24

1 + 1/3= 1.1/3
2/3 + 9/12

prob8-8.(難易度★★)(約数)

乱数で1から1000の数値を発生させ、その数値の約数を小さい順に全て表示するプログラムを作りなさい。

prob8-9.(難易度★★★)(完全数)

自分自身以外の約数の総和が自分自身に等しくなる自然数を完全数とう。例えば6の約数は1,2,3でその和は6となりますので完全数である。10000以下の整数の中から、全ての完全数を探し出し表示するプログラムを作りなさい。

prob8-9.(難易度★★)(数値の分類)

長さ10の整数型の配列変数に、1から100の整数をランダムに代入し、その値を偶数と奇数に分類して、それぞれの値を入れる配列に再代入し、その値を以下の例のように表示しなさい。


1  10  22  51  3  17  21  98  100  2
偶数:10  22  98  100  2
奇数:1  51  3  17  21

prob8-10.(難易度★★)(フィボナッチ数列)

1,1から始まり、前の2つの値の和を次の値とする数列のことを、フィボナッチ数列という(以下の例を参照)。このとき、40までのフィボナッチ数列を求めてint型の配列に代入し、表示しなさい。


1  1  2  3  5  8  13  …

prob8-10.(難易度★★)(トリボナッチ数列)

1,1,2から始まり、前の3つの値の和を次の値とする数列のことを、トリボナッチ数列という(以下の例を参照)。このとき、30までのトリボナッチ数列を求めてint型の配列に代入し、表示しなさい。


1  1  2  4  7  13  24  …

prob8-11.(難易度★★)(集合)

長さ10の整数型の配列変数を2つ用意し、それぞれに、各要素に1から10の整数を代入し、以下のようにそれぞれの配列に共通する値の一覧のみが入った配列と、2つのうちどちらかに入る数値の一覧を小さい準に代入した配列を作りなさい。


配列1:  4  9  4  3  6  8  7  1  3  10
配列2:  7  3  10  7  5  9  4  9  9  1
共通の数:1  3  4  7  9  10
どちらか入っている数:1  3  4  5  6  7  8  9  10

prob8-12.(難易度★★★)(エラトステネスのふるい)

エラトステネスのふるいを用いて、100以下の素数を全て求めるプログラムを作ってください。(配列を用いること)“エラトステネスのふるい”とは、数値の一覧表を作り、表の中から、最初の素数である2の倍数(ただし、2を除く)を全て消去し、その次に、残った数値の中から最小の数(この場合は3)の倍数を表から全て削除していく、ということを繰り返していく方法です。表の中の一番大きな数での処理が終わった段階で残った数値が、素数になります。

この場合、1は最初から除外します。

ステップ1:1はさいしょから除外。まずは、1より大きい最初の素数である、2を残す。
2  3  4  4  5  6  …  100

ステップ2:2の倍数を全て消去
3  5  7  9  5  6  …  99

ステップ3:残った数のうち最小の数である3を残し、3の倍数を全て消去
5  7  11  13  17  6  …  97

・・・同様の処理を、100以下の全ての数に繰り返す。

prob8-12.(難易度★★★)(素因数分解)

2から100の乱数を発生させ、その数を素因数分解するプログラムを作成しなさい。素因数分解とは、 数値を、素数の積で表すことであり、例えば、72 = 2 × 2 × 2 × 3 × 3といったように表現することである。

prob8-13.(難易度★★★)(並べ替え)

長さ10の整数の配列を作成し、各々の中に1から100までの乱数を代入し、その数を大きい順番に並べ替えて表示しなさい。なお、並べ替えの方法としては、以下の方法を用いなさい。

① 配列の中から、最大の数を探し出す。
② ①で見つけた数と、配列の最初の数を入れ替える。
③ 次に、配列の2番目から最後の中でもっとも大きな数を見つけ出す。
④ ③で見つけた数と、先頭に持ってきた数

prob8-14.(難易度★★★)(友愛数)

異なる2つの自然数で、自分自身を除いた約数の和が、互いに他方と等しくなるような数をいう。例えば、220の自分自身を除いた約数は、1,2,4,5,10,11,20,22,44,55,110で、和は284となる。一方、284の自分自身を除いた約数は、1,2,4,71,142で、和は220である。よって、220と284の組み合わせは友愛数という。10000以下の友愛数をすべて求めなさい。

prob8-14.(難易度★★★)(ロッカー問題)

あるクラスには、50人の生徒がいます。廊下には、1から50番までの番号がついたロッカーが並んでいます。ある日、ロッカーを使って、次のような実験をしました。

・しまっているロッカーは開ける
・開いているロッカーは閉める

という実験です。最初はすべてのロッカーは閉じてあります。
朝1番に来た生徒は、1の倍数のロッカーのみを開け閉めし、
2番目に来た生徒は、2の倍数のロッカーを開け閉めし、
3番目に来た生徒は、3の倍数のロッカーを開けしめし、
・・・
と、以下、同様に続きます。
最後にきた生徒が、ロッカーを開け閉めした後に、扉が開いているロッカーは、何個あるでしょうか?

ヒント:整数型の長さ50の配列を用意し、開いているのを-1,閉じているものを1として、カウントしてみる。

さらに勉強してみたい人は…
応用編を読んでさらに詳しい知識を身につける
Java言語の本を読んでさらに勉強してみる